2009-07-16 10 views
90

Mam kolumnę daty w tabeli MySQL. Chcę wstawić obiekt datetime.datetime() do tej kolumny. Co powinienem używać w instrukcji execute?Wstawianie obiektu datetime.datetime w języku Python do MySQL

Próbowałem:

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

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

ja otrzymuję błąd jako: "TypeError: not all arguments converted during string formatting" Co należy używać zamiast %s?

Odpowiedz

9

Spróbuj użyć obiektu now.date(), aby uzyskać obiekt Date, a nie DateTime.

Jeśli to nie zadziała, to konwersja, że ​​do łańcucha powinno działać:

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

Nie trzeba dodawać cudzysłowie parametrów łańcuchowych to znaczy "... VALUES ('% s', '% s', '% s')" –

+0

próbowałem tego. Wciąż ten sam błąd. –

2

Co bazie ty łączenia się? Wiem, że Oracle może być wrażliwy na format daty i lubi format ISO 8601.

** Uwaga: Ups, właśnie przeczytałem, że jesteś na MySQL. Wystarczy sformatować datę i wypróbować ją jako osobne bezpośrednie wywołanie SQL do przetestowania.

W Pythonie można uzyskać datę ISO jak

now.isoformat() 

Na przykład, Oracle lubi terminy takie jak

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

zależności od bazy danych, jeśli jest to Oracle może trzeba go TO_DATE :

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

Ogólne wykorzystanie TO_DATE jest:

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

Jeśli korzystasz z innej bazy danych (zobaczyłem kursor i pomyślałem Oracle; Mogę się mylić), a następnie sprawdź ich narzędzia do formatowania daty. W przypadku MySQL jest to DATE_FORMAT() i SQL   Serwer to CONVERT.

Również użycie narzędzia takiego jak SQLAlchemy spowoduje usunięcie takich różnic i ułatwi Ci życie.

+0

Nie polecam używania datetime.isoformat(), ponieważ jeśli używasz obiektu świadomego strefy czasowej, wygenerowany ciąg zawiera dane strefy czasowej i nie pasuje już do wymaganego formatu mysql. – frankster

152

Na polu czasowym, należy:

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

myślę strftime dotyczy również datetime.

+3

Działa idealnie, nawet na obiekcie datetime. Dzięki temu za milion, prawdopodobnie zaoszczędziło mi to przynajmniej 2 godziny debugowania/badania. Znalazłem to od razu za pośrednictwem Google. – anon58192932

+2

Upewnij się także, że nazwa kolumny nie jest [słowo zarezerwowane] (http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html). Zajęło mi 30 minut, aby zdać sobie sprawę, że nazwa "current_date" powodowała problemy ... ugh! – Pakman

+1

Co to jest "czas" w tym przykładzie? –

33

Najprawdopodobniej otrzymujesz błąd TypeError, ponieważ potrzebujesz cytatów wokół wartości kolumny danych.

Spróbuj:

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

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

W odniesieniu do formatu, miałem sukces z powyższego polecenia (który obejmuje milisekund) oraz:

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

nadzieję, że to pomaga.

+3

Możesz nie mieć cudzysłowów wokół '% s' w' pymsql'. –

+1

Cytaty dotyczące trzeciego błędu% s powodują, gdy próbuję tego. – realjin

0

Jeśli używasz tylko python datetime.date (nie pełnego datetime.datetime), po prostu wyślij datę jako ciąg. Jest to bardzo proste i działa dla mnie (mysql, python 2.7, Ubuntu). Kolumna published_date jest polem daty MySQL, zmienną python publish_date jest 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: 
    ... 
Powiązane problemy