【问题标题】:SQLAlchemy misses data on query when parameter is datetime.date当参数为 datetime.date 时,SQLAlchemy 会丢失查询数据
【发布时间】:2013-12-08 19:17:35
【问题描述】:

我有一个 Transaction 模型,其中一个字段是

transaction_date = Column('transaction_date',
                           sa.types.DateTime(timezone=True),
                           nullable=False)

和数据库字段看起来像

 5e5993e5-a05d-4e1a-b934-7179566d6315 | Car loan                      | 2013-08-20 13:31:16.97-07  |             |  428.00 | t     | bd675d42-aa9b-11e2-9d27-b88d1205c810 | 26c03288-86f8-4881-b5de-48e9afb11d88 | 2013-08-21 17:31:17.138526-07
 162d3409-2d73-4922-9147-52a391f86d34 | Bharat bazar                  | 2013-08-21 20:39:21.465-07 |             |    6.84 | t     | bd675d42-aa9b-11e2-9d27-b88d1205c810 | 20fe3330-80e1-4908-9f57-5b7ef575b197 | 2013-08-22 00:39:23.287429-07
 3a6c21e1-2ee6-4217-8a0e-fde13365263b | 7 eleven                      | 2013-08-23 13:53:26.593-07 |             |   26.03 | t     | bd675d42-aa9b-11e2-9d27-b88d1205c810 | 1e73aa3f-06f5-4019-828a-3f4f4d5cbe2e | 2013-08-23 17:53:29.200293-07
 ad261739-9ab2-4d13-b9c8-4809b3d7a066 | Vitamin shoppe                | 2013-08-24 12:47:52.74-07  |             |    5.46 | t     | bd675d42-aa9b-11e2-9d27-b88d1205c810 | 3141359d-9df6-4425-9261-518ccda847df | 2013-08-24 16:47:56.430282-07
 94c721a5-5cd2-41ac-b842-5989294ec978 | T2                            | 2013-08-31 16:30:41.435-07 |             |  200.00 | t     | bd675d42-aa9b-11e2-9d27-b88d1205c810 | 15147702-8227-4ee8-8b05-d2e8d532bd0a | 2013-11-24 00:30:41.457085-08

我编写的以下代码返回两个日期之间的交易

def get_transactions_for_dates(user, start, end):
        if start > end:
            raise ValueError('start date should not be greater than end date')

        return db.session.query(Transaction) \
            .filter(Transaction.user == user) \
            .filter(Transaction.transaction_date >= start) \
            .filter(Transaction.transaction_date <= end) \
            .order_by(Transaction.transaction_date.desc()).all()

有问题?

月末数据缺失2013-08-31 16:30:41.435-07

 94c721a5-5cd2-41ac-b842-5989294ec978 | T2                            | 2013-08-31 16:30:41.435-07 |             |  200.00 | t     | bd675d42-aa9b-11e2-9d27-b88d1205c810 | 15147702-8227-4ee8-8b05-d2e8d532bd0a | 2013-11-24 00:30:41.457085-08

我记录了查询,并通过sqlalchemy找到了以下查询

INFO:sqlalchemy.engine.base.Engine:SELECT transactions.uuid AS transactions_uuid, transactions.name AS transactions_name, transactions.transaction_date AS transactions_transaction_date, transactions.created_on AS transactions_created_on, transactions.modified_on AS transactions_modified_on, transactions.amount AS transactions_amount, transactions.debit AS transactions_debit, transactions.user_id AS transactions_user_id, transactions.category_id AS transactions_category_id 
FROM transactions 
WHERE %(param_1)s = transactions.user_id AND transactions.transaction_date >= %(transaction_date_1)s AND transactions.transaction_date <= %(transaction_date_2)s ORDER BY transactions.transaction_date DESC
INFO:sqlalchemy.engine.base.Engine:{'transaction_date_1': datetime.date(2013, 8, 1), 'transaction_date_2': datetime.date(2013, 8, 31), 'param_1': 'bd675d42-aa9b-11e2-9d27-b88d1205c810'}
INFO:sqlalchemy.engine.base.Engine:SELECT categories.uuid AS categories_uuid, categories.name AS categories_name, categories.parent AS categories_parent, categories.created_on AS categories_created_on 
FROM categories 

问题
- 数据类型不匹配会是一个问题吗? date 在查询 vs DateTime(tzinfo=true)?
- 我该如何解决这个问题?

【问题讨论】:

    标签: python postgresql datetime sqlalchemy


    【解决方案1】:

    使用datetime.datetime 代替datetime.date,并将结束日期的时间指定为晚上11:59。

    问题是datetime.date 在比较之前自动转换为datetime.datetime,并且它正在填写 00:00 AM,基本上没有时间on结束日期在之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 2016-03-18
      相关资源
      最近更新 更多