Menyisipkan objek datetime.datetime Python ke MySQL

120

Saya memiliki kolom tanggal di tabel MySQL. Saya ingin memasukkan datetime.datetime()objek ke dalam kolom ini. Apa yang harus saya gunakan dalam pernyataan eksekusi?

Saya telah mencoba:

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

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

Saya mendapatkan pesan kesalahan sebagai: "TypeError: not all arguments converted during string formatting" Apa yang harus saya gunakan %s?

Peter Mortensen
sumber
Anda melewatkan kutipan sekitar%s cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s , '%s')",("name", 4,now))
Sheshnath

Jawaban:

198

Untuk bidang waktu, gunakan:

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

Saya pikir strftime juga berlaku untuk datetime.

g33kz0r
sumber
4
Selain itu, pastikan nama kolom Anda bukan kata yang dipesan . Butuh waktu 30 menit untuk menyadari bahwa nama "current_date" menyebabkan masalah ... ugh!
Pakman
2
Apa timedalam contoh ini?
James McMahon
1
J McMahon: waktu adalah modul Python.
dstromberg
Bagaimana jika seseorang ingin mengambil satu-satunya Tahun, Bulan, Hari?
Pooja Khatri
42

Anda kemungkinan besar mendapatkan TypeError karena Anda membutuhkan tanda kutip di sekitar nilai kolom data.

Mencoba:

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

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

Sehubungan dengan formatnya, saya berhasil dengan perintah di atas (yang mencakup milidetik) dan dengan:

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

Semoga ini membantu.

Edvinas
sumber
8
Anda mungkin tidak memiliki kutipan %sdi sekitar pymsql.
Martin Thoma
1
Kutipan sekitar% s ketiga menyebabkan kesalahan ketika saya mencoba ini.
realjin
13

Coba gunakan now.date()untuk mendapatkan Dateobjek daripada a DateTime.

Jika itu tidak berhasil, maka mengubahnya menjadi string seharusnya berhasil:

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))
Wogan
sumber
Tidakkah Anda perlu menambahkan tanda kutip di sekitar parameter string yaitu "... VALUES ('% s', '% s', '% s')"
Gareth Simpson
5

Gunakan metode Python datetime.strftime(format), di mana 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')))

Zona waktu

Jika zona waktu menjadi perhatian, zona waktu MySQL dapat diatur untuk UTC sebagai berikut:

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

Dan zona waktu dapat diatur dengan Python:

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

Dokumentasi MySQL

MySQL mengenali nilai DATETIME dan TIMESTAMP dalam format berikut:

Sebagai string dalam format 'YYYY-MM-DD HH: MM: SS' atau 'YY-MM-DD HH: MM: SS' . Sintaks "santai" juga diizinkan di sini: Karakter tanda baca apa pun dapat digunakan sebagai pemisah antara bagian tanggal atau bagian waktu. Misalnya, '2012-12-31 11:30:45', '2012 ^ 12 ^ 31 11 + 30 + 45', '2012/12/31 11 * 30 * 45', dan '2012 @ 12 @ 31 11 ^ 30 ^ 45 'setara.

Satu-satunya pembatas yang dikenali antara bagian tanggal dan waktu dan bagian pecahan detik adalah titik desimal.

Bagian tanggal dan waktu dapat dipisahkan oleh T daripada spasi. Misalnya, '2012-12-31 11:30:45' '2012-12-31T11: 30: 45' adalah setara.

Sebagai string tanpa pembatas dalam format 'YYYYMMDDHHMMSS' atau 'YYMMDDHHMMSS', asalkan string tersebut masuk akal sebagai tanggal. Misalnya, '20070523091528' dan '070523091528' diinterpretasikan sebagai '2007-05-23 09:15:28', namun '071122129015' ilegal (memiliki bagian menit yang tidak masuk akal) dan menjadi '0000-00-00 00: 00:00 '.

Sebagai angka dalam format YYYYMMDDHHMMSS atau YYMMDDHHMMSS, asalkan angka tersebut masuk akal sebagai tanggal. Misalnya, 19830905132800 dan 830905132800 diinterpretasikan sebagai '1983-09-05 13:28:00'.

Christopher Peisert
sumber
3

Database apa yang Anda sambungkan? Saya tahu Oracle bisa pilih-pilih tentang format tanggal dan menyukai format ISO 8601 .

** Catatan: Ups, saya baru saja membaca Anda berada di MySQL. Cukup format tanggal dan coba sebagai panggilan SQL langsung terpisah untuk diuji.

Dengan Python, Anda bisa mendapatkan tanggal ISO seperti

now.isoformat()

Misalnya, Oracle menyukai tanggal seperti

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

Bergantung pada database Anda, jika itu adalah Oracle, Anda mungkin perlu TO_DATE:

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

Penggunaan umum TO_DATE adalah:

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

Jika menggunakan database lain (saya melihat kursor dan berpikir Oracle; saya bisa saja salah) kemudian periksa alat format tanggal mereka. Untuk MySQL adalah DATE_FORMAT () dan SQL Server adalah CONVERT.

Juga menggunakan alat seperti SQLAlchemy akan menghilangkan perbedaan seperti ini dan membuat hidup Anda mudah.

Ryan Christensen
sumber
Saya tidak merekomendasikan penggunaan datetime.isoformat () karena jika Anda menggunakan objek sadar zona waktu, string yang dihasilkan menyertakan data zona waktu dan tidak lagi cocok dengan format mysql yang diperlukan.
Frankster
0

Jika Anda hanya menggunakan python datetime.date (bukan datetime.datetime penuh), cukup gunakan tanggal sebagai string. Ini sangat sederhana dan berfungsi untuk saya (mysql, python 2.7, Ubuntu). Kolom published_dateadalah bidang tanggal MySQL, variabel python publish_dateadalah datetime.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:
    ...
jbartas.dll
sumber
0

saat memasukkan ke t-sql

ini gagal:

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

ini bekerja:

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

jalan mudah:

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)
Krzysztof Drewicz
sumber