66from collections .abc import Iterator
77from contextlib import contextmanager
88from dataclasses import dataclass
9- from datetime import datetime
9+ from datetime import UTC , datetime
1010from enum import Enum
1111from pathlib import Path
1212from typing import Any
@@ -38,19 +38,9 @@ def __init__(self, columns: list[str], values: list[Any]):
3838 dups = [c for c in columns if columns .count (c ) > 1 ]
3939 raise ValueError (f"Duplicate columns: { set (dups )} . Use AS to alias." )
4040
41- self ._values = tuple (
42- self ._parse_datetime (v ) if isinstance (v , str ) else v for v in values
43- )
41+ self ._values = values
4442 self ._index = {c : i for i , c in enumerate (columns )}
4543
46- def _parse_datetime (self , value : str ):
47- if 19 <= len (value ) <= 32 and value [0 ].isdigit ():
48- try :
49- return datetime .fromisoformat (value )
50- except ValueError :
51- pass
52- return value
53-
5444 def _available_columns (self ) -> str :
5545 return ", " .join ([f"'{ c } '" for c in self ._index .keys ()])
5646
@@ -154,6 +144,16 @@ def row_factory(cursor, row):
154144 return Row (columns , row )
155145
156146
147+ def adapt_datetime (value : datetime ):
148+ if value .tzinfo :
149+ value = value .astimezone (UTC )
150+ return value .replace (tzinfo = None ).isoformat (sep = " " )
151+
152+
153+ def convert_datetime (value : bytes ):
154+ return datetime .fromisoformat (value .decode ())
155+
156+
157157class Litequery :
158158 PRAGMAS = [
159159 ("journal_mode" , "wal" ),
@@ -169,11 +169,15 @@ def __init__(self, config: Config, queries):
169169 self ._thread_local = threading .local ()
170170 self ._create_methods (queries )
171171
172+ sqlite3 .register_adapter (datetime , adapt_datetime )
173+ sqlite3 .register_converter ("datetime" , convert_datetime )
174+
172175 def _create_connection (self ) -> sqlite3 .Connection :
173176 conn = sqlite3 .connect (
174177 self .config .database_path ,
175178 timeout = 30 ,
176179 autocommit = True ,
180+ detect_types = sqlite3 .PARSE_COLNAMES | sqlite3 .PARSE_DECLTYPES ,
177181 )
178182 conn .row_factory = row_factory
179183 pragmas = (f"PRAGMA { p } = { v } " for p , v in self .PRAGMAS )
0 commit comments