12

私は SQLAlchemy を初めて使用します (ただし、それほど新しくはありません)。プロジェクトにバージョン 0.9.3 を使用しています。SQLite データベースに対してクエリを実行し、結果をフィルタリングして、タイム スタンプのないオブジェクト、または最後の更新から 24 時間以上経過したオブジェクトを取得したいと考えています (同じ列で)。

問題は、時間フィルタリング部分をどのように達成するかについて正確な考えがないことです.IPython Notebookセッションを行ったので、人々は私の問題への答えを探している時間を確認できます:

1で]:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Unicode, DateTime, Integer, create_engine
from sqlalchemy.orm import sessionmaker, relationship, backref
from datetime import datetime

engine = create_engine('sqlite:///:memory:')
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()

[2]:

class Product(Base):
    __tablename__ = "product"

    id = Column(Integer, primary_key=True)
    name = Column(Unicode(140), unique=True, nullable=False)
    department = Column(Unicode(20))
    added = Column(DateTime, default=datetime.now)
    last_time_parsed = Column(DateTime)

    def repr(self):
        return "<Product(name=%s, department=%s, added=%s, last_time_parsed=%s)>" % (
                            self.name, self.department, self.added, self.last_time_parsed)

[3]:

# create the tables
Base.metadata.create_all(engine)

[4]:

# create a false product
p1 = Product(name="Product X")
p2 = Product(name = "Product Y")
p3 = Product(name = "Product Z")

[5] では:

session.add(p1)
session.add(p2)
session.add(p3)
session.commit()

/home/jorge/projects/project1/lib/python2.7/site-packages/sqlalchemy/engine/default.py:525: SAWarning: Unicode type received non-unicode bind param value.
  param.append(processors[key](compiled_params[key]))

[7] では:

q = session.query(Product).filter(Product.last_time_parsed == None).filter(Product.last_time_parsed > 24)

[9] では:

print q.first().name

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-377361de0bab> in <module>()
----> 1 print q.first().name

AttributeError: 'NoneType' object has no attribute 'name'

[14] では:

q = session.query(Product).filter(Product.last_time_parsed == None)

[15]:

print q.first().name

Product X

[16]:

q = session.query(Product).filter(Product.last_time_parsed < 24)
print q.first().name

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-16-b10ccbb5d88d> in <module>()
      1 q = session.query(Product).filter(Product.last_time_parsed < 24)
----> 2 print q.first().name

AttributeError: 'NoneType' object has no attribute 'name'

[20]:

q = session.query(Product).filter(Product.added > 24)
print q.first().name

Product X

の []:

input 20私はそれがDateTimeデータ型であることを知っていますProduct.added(DateTime値を保持する唯一の列であるため、テストするために使用しました)。私が理解していないのは、論理ステートメントです。(にProduct.added < 24示されているようにinput 16) ではなくProduct.added > 24、データベースからオブジェクトを取得しない場合。24では、実際にデータベースが理解している数字とは何でしょうか? 24分?24時間?24秒?24日?

繰り返しになりますが、データをフィルター処理して、タイム スタンプのないデータや 24 時間以上前に更新されたデータを取得するにはどうすればよいでしょうか?

ありがとう :)

4

2 に答える 2