2009-12-02 13 views

Antwort

91

Wenn Sie Ihre Spalte mit einer Art Zeitstempel erklären, sind Sie in Klee:

>>> db = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES) 
>>> c = db.cursor() 
>>> c.execute('create table foo (bar integer, baz timestamp)') 
<sqlite3.Cursor object at 0x40fc50> 
>>> c.execute('insert into foo values(?, ?)', (23, datetime.datetime.now())) 
<sqlite3.Cursor object at 0x40fc50> 
>>> c.execute('select * from foo') 
<sqlite3.Cursor object at 0x40fc50> 
>>> c.fetchall() 
[(23, datetime.datetime(2009, 12, 1, 19, 31, 1, 40113))] 

sehen? Sowohl int (für eine deklarierte Ganzzahl einer Spalte) als auch datetime (für eine deklarierte Zeitmarke einer Spalte) überleben den Umlauf mit intaktem Typ.

+4

Danke, Alex, es funktioniert! Ich bin überrascht, weil der Typ TIMESTAMP auf http://www.sqlite.org/datatype3.html – EMP

+15

@Evgeny überhaupt nicht erwähnt wird, siehe http://docs.python.org/library/sqlite3 .html # default-adapter-and-converters - es ist auf sqlite.org nicht dokumentiert, da es tatsächlich in der Python-Ebene implementiert ist, nicht in sqlite selbst! –

+12

Ich finde nur heraus, es ist der __detect_types = sqlite3.PARSE_DECLTYPES__ Parameter der Connect-Funktion, die Fetchall eine Datetime zurückgibt. Wenn Sie es weglassen, haben Sie ein Unicode-Objekt. – Ponytech

17

Es stellt sich heraus, dass sqlite3 kann dies tun und es ist sogar documented, Art von - aber es ist ziemlich leicht zu übersehen oder missverstehen.

Was ich tun musste, ist:

  • Geben Sie die sqlite3.PARSE_COLNAMES Option im .Connect() Aufruf, zum Beispiel.
conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES) 
  • den Typ Put ich in die Abfrage wollte - und für Datetime, es ist nicht wirklich "Datetime", sondern "Zeitstempel":

    sql = 'SELECT jobid, startedTime as "[timestamp]" FROM job' 
    
    cursor = conn.cursor() 
    try: 
        cursor.execute(sql) 
        return cursor.fetchall() 
    finally: 
        cursor.close() 
    

Wenn ich "datetime" übergebe, wird es still ignoriert und ich bekomme immer noch eine Zeichenfolge zurück. Gleiches, wenn ich die Anführungszeichen weglasse.

+0

Hm, würden Sie bitte etwas mehr Code zeigen ? Ich kann nicht scheinen, dass dies funktioniert ... – unutbu

+2

beachten Sie, dass es definitiv ist "[Zeitstempel]", "[Zeitstempel]" wird stillschweigend ignoriert, und '.fetchone' wird auch nicht die Typen konvertieren. Was für eine seltsame Bibliothek. –

1

Hinweis: In Python3, ich hatte wie die SQL, um etwas zu ändern:

SELECT jobid, startedTime as "st [timestamp]" FROM job

(. Ich hatte die Spalte explizit zu nennen)

Verwandte Themen