2011-04-17 69 views
2
token=uuid.uuid4().bytes.encode("base64") 
expires=datetime.now()+timedelta(days=1) 
print token 
print expires 
con = sqlite3.connect(dbpath,detect_types=sqlite3.PARSE_DECLTYPES) 
cur = con.cursor() 
cur.execute(
    "INSERT INTO token VALUES ('%s', ?)" % 
     (token,expires)) 
a=cur.fetchone() 
con.commit() 
con.close() 

CREATE TABLE令牌(令牌VARCHAR(255),期滿日期);商店蟒DateTime對象中的sqlite3

錯誤 類型錯誤:不串轉換過程中的所有參數格式

+1

這已經被回答http://stackoverflow.com/questions/1829872/read-datetime-back-from-sqlite-as-a-datetime-in-python – XORcist 2011-04-17 12:06:56

回答

9

從不使用%運算符與SQL - 它可以導致SQL注入。修復您execute聲明是這樣的:

cur.execute("INSERT INTO token VALUES (?, ?)", (token,expires)) 

其實還有另外一個問題:INSERT後,您不能使用cur.fetchone()

完整的示例:

$ sqlite3 test.db 
sqlite> create table token (token text primary key, expires text); 

$ python 
>>> import sqlite3 
>>> from datetime import datetime, timedelta 
>>> from uuid import uuid4 
>>> token = uuid4().bytes.encode("base64") 
>>> expires = datetime.now() + timedelta(days=1) 
>>> conn = sqlite3.connect("test.db") 
>>> cur = conn.cursor() 
>>> cur.execute("INSERT INTO token VALUES (?, ?)", (token, expires)) 
<sqlite3.Cursor object at 0x7fdb18c70660> 
>>> cur.execute("SELECT * FROM token") 
<sqlite3.Cursor object at 0x7fdb18c70660> 
>>> cur.fetchone() 
(u'9SVqLgL8ShWcCzCvzw+2nA==\n', u'2011-04-18 15:36:45.079025') 
+0

@ hdima得到相同的錯誤依然。我正在使用sqlite3 – 2011-04-17 11:27:26

+0

...這在這個頁面上詳細記錄:http://docs.python.org/release/2.6/library/sqlite3.html – arie 2011-04-17 11:27:34

+0

我可以堅持到數據庫,如果我使用%s佔位符在sqlite3中。但它會是datetime.datetime當我檢索 – 2011-04-17 11:34:08

1

錯誤是自說。

字符串插值失敗,因爲您將兩個參數傳遞給INSERT字符串 ,但只有一個%s佔位符。你想要什麼?''這裏。

也許你螞蟻

cur.execute( 'INSERT ....',令牌到期)

+0

我想堅持日期時間的對象..我應該使用哪個佔位符,以便我作爲日期時間對象而不是字符串 – 2011-04-17 11:19:33

+0

請花時間閱讀http://docs.python.org/library/sqlite3.html – 2011-04-17 12:13:51