我在剧本中看到了最奇怪的行为。我从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对象有关的任何想法?
答案 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”)希望这是有道理和有帮助的。