Хранить объект даты и времени Python в sqlite3 - PullRequest
2 голосов
/ 17 апреля 2011
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), срок действия истекает);

Ошибка Ошибка типа: не все аргументы, преобразованные во времяформатирование строки

Ответы [ 2 ]

9 голосов
/ 17 апреля 2011

Никогда не используйте оператор % с 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 голос
/ 17 апреля 2011

Ошибка говорит сама за себя.

Сбой интерполяции строки, потому что вы передаете два параметра в строку INSERT но есть только один заполнитель% s. Что вы хотите с '?' здесь.

Возможно, вы муравей

cur.execute ('INSERT ....', токен, срок действия истекает)

??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...