2

私のスクリプトで最も奇妙な動作が見られます。datetime.datetime オブジェクトであるかのように、datetime.date オブジェクトを変換しようとしているように見える dbapi2.py から ValueError を取得しています。

  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 オブジェクトで問題を起こす理由はありますか?

4

1 に答える 1

2

あなたは欠けていますtimepart

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

sqlite3convert_timestampコンバーターに当たっています。

デフォルトのアダプタとコンバータのドキュメンテーション ページにsqlite3は、いくつかの例が示されています。知られていることから、代わりに完全な文字列を期待する であるeffected_dtと仮定することができます。timestampdatetime.datetime

したがって、あなたがすることは次のとおりです。

  • datetime.datetime代わりに使用
  • 日付を受け入れるタイプの新しいコンバーターを登録しtimestampます (たとえば、「2012-12-17 00:00:00」を返します)。
  • 列の種類を変更する

これが理にかなっており、役立つことを願っています。

于 2012-12-18T13:01:46.780 に答える