4

Python/MySQL の日時形式に問題があります。

次のスクリプトを使用して日時を計算します (Python 辞書によって供給されます)。

tempDate  = str(eachday.get("date").get("year")).zfill(4) + "-" + 
str(eachday.get("date").get("month")).zfill(2) + "-" + 
str(eachday.get("date").get("day")).zfill(2)   + " " + 
str(eachday.get("date").get("hour")).zfill(2)  + ":" + 
str(eachday.get("date").get("min")).zfill(2)   + ":" + 
str(eachday.get("date").get("sec")).zfill(2)

のような値が得られます2012-04-02 04:04:23

問題なく MySQL に挿入できます。

sql.execute("""INSERT INTO `db`.`table`(`id`, `fk_id`, `time`, `field1`, `field2`) VALUES (NULL, %s, %s, %s, %s);""", (fk_value, tempDate, value1, value2)) 
DB_CONN.commit()

しかし、その日時で何かを削除しようとすると、

sql.execute("""DELETE FROM `db`.`table` WHERE `time` = "%s";""", (tempDate))
DB_CONN.commit()

不正な日時値に関する警告を返します。

Warning: Incorrect datetime value: ''2012-07-17 23:00:00'' for column 'time' at row 1

Pythonで日時で削除するにはどうすればよいですか? 同じ変数 (何も変更されていない) を挿入すると完全に機能するため、これは特に混乱を招きます。

4

2 に答える 2

3

"%s"クエリ文字列に引用符を含めることはできません。mysqldb モジュールがそれらを追加します (値を引用符で囲まない場合と同じINSERTです...)

于 2012-07-08T23:26:07.950 に答える
2

このモジュールは簡単に利用できます。このdatetimeモジュールは、日付文字列を作成するためにさらに制御されています。

from datetime import datetime

eachday = {
    'date': {
        'day': 2, 
        'hour': 4, 
        'min': 4, 
        'month': 4, 
        'sec': 23, 
        'year': 2012
    }
}
keys = ('year','month','day','hour','min','sec')
dt = datetime(*(eachday['date'][k] for k in keys))
print dt.strftime('%Y-%m-%d %H:%M:%S')
# '2012-04-02 04:04:23'

日時を使用する利点は、とにかくMySQLdbから取得するネイティブ形式であるということです。そして、変換なしの値として渡すことができます。したがって、実際には、日付文字列をフォーマットする必要すらありません。

sql.execute("DELETE FROM `db`.`table` WHERE `time`=%s", (dt,))

intコンポーネントを持ち歩くのではなく、datetime値をdatetimeオブジェクトとしてできるだけ長く保持することをお勧めします。

于 2012-07-08T23:36:12.573 に答える