web-dev-qa-db-ja.com

Python datetime.datetimeオブジェクトをMySQLに挿入する

MySQLテーブルに日付列があります。この列にdatetime.datetime()オブジェクトを挿入したい。実行文で何を使用すべきですか?

私が試してみました:

now = datetime.datetime(2009,5,5)

cursor.execute("INSERT INTO table
(name, id, datecolumn) VALUES (%s, %s
, %s)",("name", 4,now))

次のようなエラーが表示されます:"TypeError: not all arguments converted during string formatting"%sの代わりに何を使用すればよいですか?

105
Scaraffe

時間フィールドには、次を使用します。

import time    
time.strftime('%Y-%m-%d %H:%M:%S')

Strftimeはdatetimeにも適用されると思います。

177
g33kz0r

Datecolumn値を引用符で囲む必要があるため、TypeErrorが発生する可能性が高くなります。

試してください:

now = datetime.datetime(2009, 5, 5)

cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, '%s')",
               ("name", 4, now))

フォーマットに関しては、上記のコマンド(ミリ秒を含む)と次のコマンドで成功しました。

now.strftime('%Y-%m-%d %H:%M:%S')

お役に立てれば。

40
Edvinas

DateではなくDateTimeオブジェクトを取得するには、now.date()を使用してください。

それが機能しない場合、それを文字列に変換する必要があります:

now = datetime.datetime(2009,5,5)
str_now = now.date().isoformat()
cursor.execute('INSERT INTO table (name, id, datecolumn) VALUES (%s,%s,%s)', ('name',4,str_now))
12
Wogan

どのデータベースに接続していますか?オラクルは日付の形式を気にし、 ISO 8601 形式が好きだと知っています。

**注:おっと、MySQLについて読んでいるだけです。日付をフォーマットして、テストする別の直接SQL呼び出しとして試してください。

Pythonでは、次のようなISO日付を取得できます。

now.isoformat()

たとえば、Oracleは次のような日付が好きです

insert into x values(99, '31-may-09');

データベースによっては、Oracleの場合、TO_DATEが必要になる場合があります。

insert into x
values(99, to_date('2009/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));

TO_DATEの一般的な使用法は次のとおりです。

TO_DATE(<string>, '<format>')

別のデータベースを使用している場合(カーソルを見てOracleと思ったので間違っている可能性があります)、日付形式ツールを確認してください。 MySQLの場合はDATE_FORMAT()であり、SQL ServerはCONVERTです。

また、 SQLAlchemy のようなツールを使用すると、このような違いがなくなり、作業が楽になります。

2

python datetime.date(完全なdatetime.datetimeではなく)を使用している場合は、日付を文字列としてキャストするだけです。これは非常に簡単で、私にとってはうまくいきます(mysql、python 2.7、Ubuntu)。列published_dateはMySQL日付フィールドであり、python変数publish_datedatetime.dateです。

# make the record for the passed link info
sql_stmt = "INSERT INTO snippet_links (" + \
    "link_headline, link_url, published_date, author, source, coco_id, link_id)" + \
    "VALUES(%s, %s, %s, %s, %s, %s, %s) ;"

sql_data = ( title, link, str(publish_date), \
             author, posted_by, \
             str(coco_id), str(link_id) )

try:
    dbc.execute(sql_stmt, sql_data )
except Exception, e:
    ...
0
jbartas

Pythonメソッドを使用します datetime.strftime(format) 、ここでformat = '%Y-%m-%d %H:%M:%S'

import datetime

now = datetime.datetime.utcnow()

cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, %s)",
               ("name", 4, now.strftime('%Y-%m-%d %H:%M:%S')))

時間帯

タイムゾーンが懸念される場合、次のようにMySQLタイムゾーンをUTCに設定できます。

cursor.execute("SET time_zone = '+00:00'")

そして、タイムゾーンはPythonで設定できます:

now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)

MySQLドキュメント

MySQLは、次の形式のDATETIMEおよびTIMESTAMP値を認識します。

'YYYY-MM-DD HH:MM:SS'または 'YY-MM-のいずれかの文字列としてDD HH:MM:SS '形式。ここでも「リラックスした」構文を使用できます。句読点文字は、日付部分または時間部分の間の区切り文字として使用できます。たとえば、「2012-12-31 11:30:45」、「2012 ^ 12 ^ 31 11 + 30 + 45」、「2012/12/31 11 * 30 * 45」、および「2012 @ 12 @ 31 11」 ^ 30 ^ 45 'は同等です。

日付と時刻の部分と秒の小数部分の間に認識される唯一の区切り文字は小数点です。

日付と時刻の部分は、スペースではなくTで区切ることができます。たとえば、「2012-12-31 11:30:45」「2012-12-31T11:30:45」は同等です。

「YYYYMMDDHHMMSS」または「YYMMDDHHMMSS」形式の区切り文字のない文字列。ただし、文字列が日付として意味がある場合。たとえば、「20070523091528」と「070523091528」は「2007-05-23 09:15:28」と解釈されますが、「071122129015」は無効であり(意味のない分部分があります)、「0000-00-00 00」になります。 00:00 '。

YYYYMMDDHHMMSSまたはYYMMDDHHMMSS形式の数字として(日付として意味がある場合)。たとえば、19830905132800と830905132800は「1983-09-05 13:28:00」と解釈されます。

0