2013-05-21 79 views
0

我想插入我的datettime對象到MySQL插入MySQL中

>>> t 
datetime.datetime(2013, 5, 21, 19, 33, 36, tzinfo=tzutc()) 
>>> cursor.execute('INSERT INTO tweets(created_at) VALUES ({created_at})'.format(created_at=t)) 

錯誤我得到datetime.datetime對象:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute 
    self.errorhandler(self, exc, value) 
    File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '19:33:36+00:00)' at line 1") 
>>> 

的MySQL:

mysql> DESCRIBE mytable; 
+-------------+---------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+-------------+---------------------+------+-----+---------+-------+ 

| created_at | datetime   | YES |  | NULL |  | 

+-------------+---------------------+------+-----+---------+-------+ 
+1

嘗試:>>> cursor.execute('INSERT INTO tweets(created_at)VALUES(「{created_at}」)'.format(created_at = t))注意空間和「 –

+0

我不知道任何關於數據庫(但),但你使用的字符串格式會隱式地在你的datetime對象上調用'str',並使用該字符串來替換'{created_at}'。從錯誤中看,這個字符串就是導致mysql 0123。 – mgilson

+0

你是那麼對!@古斯塔沃巴爾加斯,謝謝你的作品 – Vor

回答

0

嘗試在表格名稱後面插入空格,並將文本放在「」中,如下所示:

cursor.execute('INSERT INTO tweets (created_at) VALUES ("{created_at}")'.format(created_at=t)) 
+0

向下投票是好的,但會更好,如果我知道爲什麼... –

+1

應該避免使用'format'字符串方法,變量不會被轉義,並且會出現SQL注入問題,請參閱[Django的文檔](https://docs.djangoproject.com/en/)。開發/主題/ DB/SQL /#CON nections-and-cursors)在這個問題上。 –

+0

我同意你的看法,但在他的情況下,這個變量只來自內部代碼。這是否也受到注射?我不是很諷刺,我真的在問你,我不是一個有識字的編碼。 –

3

使用參數化的SQL,而不是字符串格式化和手動報價:

cursor.execute('INSERT INTO tweets(created_at) VALUES (%s)', [t]) 

它更容易,並有助於防止sql injection