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),DATE到期);
错误 TypeError:并非在字符串格式化期间转换所有参数
答案 0 :(得分:9)
永远不要将%
运算符与SQL一起使用 - 它可能会导致SQL注入。修复您的execute
语句,如下所示:
cur.execute("INSERT INTO token VALUES (?, ?)", (token,expires))
实际上还有一个问题:在cur.fetchone()
之后你无法使用INSERT
。
完整示例:
$ 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')
答案 1 :(得分:1)
错误是自言自语。
字符串插值失败,因为您将两个参数传递给INSERT字符串 但是占位符只有一个%。你想要什么'?'这里。
也许你蚂蚁
cur.execute('INSERT ....',token,expires)
...