2014-04-30 5 views
0

Je suis conscient de ce similar question on SO qui demande essentiellement la même chose. Cependant, je semble avoir un message d'erreur. Laisse-moi expliquer.Python Stockage et récupération de la date dans la base de données Sqlite3

Afin de tester l'idée de stocker et récupérer Python objet Date avec base de données Sqlite3, j'ai créé ce petit script de test:

import sqlite3 
import datetime 

conn = sqlite3.connect("test.db") 
conn.execute('''CREATE TABLE TEST 
      (
      ID  TEXT PRIMARY KEY  NOT NULL, 
      DATE TIMESTAMP 
      );''') 

conn.commit() 

mydate = datetime.date(2014,4,28) 
myid = 'test' 

conn.execute("INSERT INTO TEST (ID,DATE)\ 
      VALUES(?,?)",[myid,mydate]) 
conn.commit() 
conn.close() 

conn = sqlite3.connect("test.db") 
cursor = conn.execute("SELECT ID,DATE from TEST") 
for row in cursor: 
    retrievedDate = row[1] 

print retrievedDate,type(retrievedDate) 
conn.close() 

Les travaux de code, mais la date récupérée est en unicode.

J'ai découvert à partir du lien ci-dessus que sans les paramètres detect_types=sqlite3.PARSE_DECLTYPES sqlite retournera unicode. Alors, je l'ai changé le code comme ceci:

... 
conn = sqlite3.connect("test.db",detect_types=sqlite3.PARSE_DECLTYPES) 
cursor = conn.execute("SELECT ID,DATE from TEST") 
for row in cursor: 
    retrievedDate = row[1] 

print retrievedDate,type(retrievedDate) 
... 

Mais maintenant, il me donne ce message d'erreur:

File "C:\Python27\lib\sqlite3\dbapi2.py", line 66, in convert_timestamp 
    datepart, timepart = val.split(" ") 
ValueError: need more than 1 value to unpack 

Ce qui est à l'origine du problème?

Répondre

1

Vous avez déclaré la colonne à un horodatage:

conn.execute('''CREATE TABLE TEST 
      (
      ID  TEXT PRIMARY KEY  NOT NULL, 
      DATE TIMESTAMP 
      );''') 

Faites tappez DATE à la place; Python choisit un convertisseur basé sur le type de colonne et TIMESTAMP déclenche le mauvais convertisseur ici.

Démo:

>>> import sqlite3 
>>> import datetime 
>>> conn = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES) 
>>> conn.execute('''CREATE TABLE TEST (ID TEXT PRIMARY KEY NOT NULL, DATE DATE)''') 
<sqlite3.Cursor object at 0x104a5adc0> 
>>> conn.commit() 
>>> conn.execute("INSERT INTO TEST (ID,DATE) VALUES (?, ?)", 
...    ('foo', datetime.date(2014,4,28))) 
<sqlite3.Cursor object at 0x104a5ae30> 
>>> conn.commit() 
>>> cursor = conn.execute("SELECT ID,DATE from TEST") 
>>> for row in cursor: 
...  print row 
... 
(u'foo', datetime.date(2014, 4, 28)) 

Vous pouvez également inclure le nom du type dans la requête SELECT entre crochets:

cur.execute('SELECT ID, DATE [date] from TEST') 
+0

Il fonctionne! Le lien vers une autre question SO sur mon message a utilisé 'timestamp' au lieu de' DATE'. Mais "DATE" semble bien fonctionner pour moi. Merci –

+1

@ChrisAung: 'timestamp' est pour les objets' datetime.datetime' à la place. –

Questions connexes