2009-07-16 34 views
90

Tôi có cột ngày trong bảng MySQL. Tôi muốn chèn một đối tượng datetime.datetime() vào cột này. Tôi nên sử dụng cái gì trong câu lệnh execute?Chèn đối tượng datetime.datetime Python vào MySQL

Tôi đã thử:

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

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

Tôi nhận được một lỗi như: "TypeError: not all arguments converted during string formatting" Tôi nên sử dụng thay vì %s?

Trả lời

9

Hãy thử sử dụng now.date() để nhận đối tượng Date thay vì DateTime.

Nếu điều đó không làm việc, sau đó chuyển đổi đó để một chuỗi nên làm việc:

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

Đừng bạn cần phải thêm dấu ngoặc kép quanh các tham số chuỗi ví dụ: "... VALUES ('% s', '% s', '% s')" –

+0

Tôi cố gắng đó. Vẫn là lỗi tương tự. –

2

cơ sở dữ liệu gì bạn đang kết nối? Tôi biết Oracle có thể cầu kỳ về định dạng ngày và thích định dạng ISO 8601.

** Lưu ý: Rất tiếc, tôi vừa đọc bạn đang sử dụng MySQL. Chỉ cần định dạng ngày và thử nó như là một cuộc gọi SQL trực tiếp riêng biệt để kiểm tra.

Trong Python, bạn có thể nhận được một ngày ISO như

now.isoformat() 

Ví dụ, Oracle thích ngày như

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

Tùy thuộc vào cơ sở dữ liệu của bạn, nếu nó là Oracle bạn có thể cần phải TO_DATE nó :

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

Cách sử dụng chung TO_DATE là:

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

Nếu sử dụng cơ sở dữ liệu khác (tôi đã thấy con trỏ và nghĩ Oracle); Tôi có thể sai) sau đó kiểm tra các công cụ định dạng ngày của họ. Đối với MySQL, nó là DATE_FORMAT() và SQL   Server là CONVERT.

Cũng sử dụng công cụ như SQLAlchemy sẽ xóa những khác biệt như thế này và giúp cuộc sống của bạn trở nên dễ dàng.

+0

Tôi không khuyên bạn sử dụng datetime.isoformat() vì nếu bạn sử dụng đối tượng nhận biết múi giờ, chuỗi được tạo bao gồm dữ liệu múi giờ và không còn khớp với định dạng mysql được yêu cầu nữa. – frankster

152

Đối với một lĩnh vực thời gian, sử dụng:

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

Tôi nghĩ strftime cũng áp dụng cho datetime.

+3

Làm việc hoàn hảo, ngay cả đối tượng ngày giờ. Cảm ơn một triệu cho điều này, có lẽ đã cứu tôi ít nhất 2 giờ gỡ lỗi/nghiên cứu. Tìm thấy nó ngay lập tức thông qua Google. – anon58192932

+2

Ngoài ra, hãy đảm bảo tên cột của bạn không phải là [từ dành riêng] (http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html). Mất 30 phút để nhận ra cái tên "current_date" đã gây ra vấn đề ... ugh! – Pakman

+1

'Thời gian' trong ví dụ này là gì? –

33

Bạn rất có thể nhận được TypeError vì bạn cần báo giá xung quanh giá trị datecolumn.

Hãy thử:

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

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

Liên quan đến định dạng, tôi đã thành công với lệnh trên (trong đó bao gồm các mili giây) và với:

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

Hope this helps.

+3

Bạn có thể không có dấu ngoặc kép xung quanh '% s' trong' pymsql'. –

+1

Báo giá xung quanh lỗi gây ra% s thứ ba khi tôi thử điều này. – realjin

0

Nếu bạn chỉ sử dụng một datetime.date python (không phải là datetime.datetime đầy đủ), chỉ cần bỏ ngày đó làm chuỗi. Điều này rất đơn giản và làm việc cho tôi (mysql, python 2.7, Ubuntu). Cột published_date là trường ngày của MySQL, biến số 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: 
    ... 
Các vấn đề liên quan