Sqlite3 dbapi2.py日期转换问题

时间:2012-12-18 11:52:36

标签: python sqlite

我在剧本中看到了最奇怪的行为。我从dbapi2.py得到一个ValueError,它似乎试图在datetime.date对象上进行转换,好像它是一个datetime.datetime对象:

  File "C:\Python27\Lib\sqlite3\dbapi2.py", line 66, in convert_timestamp
    datepart, timepart = val.split(" ")
  ValueError: need more than 1 value to unpack

我没有做任何特别的事情,事实上我有几个其他的脚本做同样的事情,只是略有不同的tSql,没有任何问题。这是构建Sql的类:

class TransactionQuery:

    def __init__(self, account_iter, date):
        self.account_iter = tuple(account_list)
        self.date = date
        placeholder = ("?" for item in self.account_list)
        placeholders = ', '.join(item for item in placeholder)
        self.query = """select * from transactions where account_cd in (%s) and 
                        effected_dt = ?""" % placeholders

    @property
    def params(self):
        return (self.account_list) + (self.date,)

调用它的代码:

with Sqlite() as curs:
    print mquery.query
    print mquery.params
    curs.execute(mquery.query, mquery.params)
    return curs.fetchall()

来自印刷声明的输出:

select * from transactions where account_cd in (?, ?, ?, ?) and effected_dt = ?
('713271', '71204', '713311', '713471', datetime.date(2012, 12, 17))

在这种情况下,为什么Sqlite会遇到与datetime.date对象有关的任何想法?

1 个答案:

答案 0 :(得分:2)

您错过了timepart

(datepart, timepart) = str( datetime.date(2012, 12, 17) ).split( ' ' )
## ValueError: need more than 1 value to unpack

sqlite3正在点击convert_timestamp转化器。

sqlite3

Default Adapters and Converters文档页面显示了一些示例。据我所知,我可以尝试假设effected_dt是一个timestamp,它需要一个完整的datetime.datetime字符串。

所以你要做的就是以下几点:

  • 使用datetime.datetime代替
  • 为接受日期的timestamp类型注册新转换器(例如返回“2012-12-17 00:00:00”)
  • 更改列类型

希望这是有道理和有帮助的。