MySQLへのPython datetime.datetimeオブジェクトの挿入


120

MySQLテーブルに日付列があります。datetime.datetime()この列にオブジェクトを挿入したい。executeステートメントでは何を使用する必要がありますか?

私が試してみました:

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ですか?


あなたは周りの引用符を逃しました%s cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s , '%s')",("name", 4,now))
Sheshnath

回答:


198

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

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

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


4
また、列名が予約語ではないことを確認してください。「current_date」という名前が問題を引き起こしていることに気付くまで30分かかりました...
Pakman、2013年

2
timeこの例には何がありますか?
James McMahon

1
Jマクマホン:時間はPythonモジュールです。
dstromberg 2016

誰かが年、月、日だけをフェッチしたい場合はどうなりますか?
Pooja Khatri

42

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')

お役に立てれば。


8
あなたの周りの引用符がないこと%sではpymsql
Martin Thoma

1
3番目の%sを引用符で囲むと、エラーが発生します。
realjin

13

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

それが機能しない場合は、それを文字列に変換すると機能します。

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))

文字列パラメータを囲む引用符を追加する必要はありませんか? "... VALUES( '%s'、 '%s'、 '%s')"
Gareth Simpson

5

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」と解釈されます。


3

どのデータベースに接続していますか?オラクルは日付形式にこだわり、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のようなツールを使用すると、これらのような違いが取り除かれ、作業が楽になります。


datetime.isoformat()の使用はお勧めしません。タイムゾーン対応オブジェクトを使用すると、生成される文字列にはタイムゾーンデータが含まれ、必要なmysqlフォーマットと一致しなくなるためです。
フランクスター、2016年

0

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

t-sqlに挿入するとき

これは失敗します:

select CONVERT(datetime,'2019-09-13 09:04:35.823312',21)

これは機能します:

select CONVERT(datetime,'2019-09-13 09:04:35.823',21)

簡単な方法:

regexp = re.compile(r'\.(\d{6})')
def to_splunk_iso(dt):
    """Converts the datetime object to Splunk isoformat string."""
    # 6-digits string.
    microseconds = regexp.search(dt).group(1)
    return regexp.sub('.%d' % round(float(microseconds) / 1000), dt)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.