Ich verwende das SQLite3-Modul in Python 2.6.4, um eine Datetime in einer SQLite-Datenbank zu speichern. Das Einfügen ist sehr einfach, da sqlite das Datum automatisch in eine Zeichenkette umwandelt. Das Problem ist, dass es beim Lesen als String zurückkommt, aber ich muss das ursprüngliche Datetime-Objekt rekonstruieren. Wie mache ich das?Wie kann man Datetime zurück von Sqlite als Datetime anstelle von String in Python lesen?
Antwort
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.
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.
Hm, würden Sie bitte etwas mehr Code zeigen ? Ich kann nicht scheinen, dass dies funktioniert ... – unutbu
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. –
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)
- 1. Monat von DATETIME in sqlite
- 2. Wie konvertiert man eine Datetime-Zeichenfolge zurück in Datetime-Objekt?
- 3. DATETIME-Suchprädikat in DATETIME-Spalte viel langsamer als String-Literalprädikat
- 4. Python "Import Datetime" vs. „Von Datetime-Importdatetime“
- 5. Einfügen von Datetime in SQLite-Datenbank Android
- 6. Wie konvertiert man DateTime in String?
- 7. Wie json Datum von C# Datetime zurück
- 8. Parse von String zu DateTime
- 9. Android/Java Sqlite: Wie Max Datetime abrufen?
- 10. Casting String als DateTime in LINQ
- 11. Verwenden Sie datetime anstelle von mysql now()?
- 12. Datetime-String mit Serie in Python Pandas
- 13. Konvertieren von DateTime in String in Julia
- 14. Datetime string format alignment
- 15. Wie konvertiert man SQL String datetime
- 16. Zeige Datum anstelle von DateTime in Telerik Grid
- 17. Konvertieren DateTime in String PHP
- 18. Einfügen von datetime als String C# SQL-Server
- 19. Datetime-Konvertierung Python mit
- 20. Wie kann ich SQL Datetime richtig in C# Datetime konvertieren?
- 21. nur Zeit von Datetime-Feld in SQLite wählen
- 22. Speichern von "String" als "TEXT" anstelle von "VarChar" in SQLite - WP8
- 23. Get DateTime dayOfWeek/dayOfMonth als String
- 24. Datetime-Vergleich mit String?
- 25. SQLite ExecuteReader -> DataTable.Load -> FormatException (DateTime)
- 26. Datetime-Vergleichsverhalten in Python
- 27. Konvertieren von UTC Datetime zu lokalem Datetime
- 28. Wie subtrahiert man von einer Datetime?
- 29. Wie kann ich Eigenschaften von DateTime trennen?
- 30. Wie kommt man den Zeitraum von Datetime
Danke, Alex, es funktioniert! Ich bin überrascht, weil der Typ TIMESTAMP auf http://www.sqlite.org/datatype3.html – EMP
@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! –
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