2222# consistent with the Postgres engine.
2323
2424
25+ # In
26+
27+
2528def convert_numeric_in (value ):
2629 """
2730 Convert any Decimal values into floats.
2831 """
2932 return float (value )
3033
3134
32- def convert_uuid_in (value ):
35+ def convert_uuid_in (value ) -> str :
3336 """
3437 Converts the UUID value being passed into sqlite.
3538 """
3639 return str (value )
3740
3841
39- def convert_time_in (value ):
42+ def convert_time_in (value ) -> str :
4043 """
4144 Converts the time value being passed into sqlite.
4245 """
@@ -50,13 +53,27 @@ def convert_date_in(value):
5053 return value .isoformat ()
5154
5255
56+ def convert_datetime_in (value : datetime .datetime ) -> str :
57+ """
58+ Converts the datetime into a string. If it's timezone aware, we want to
59+ convert it to UTC first. This is to replicate Postgres, which stores
60+ timezone aware datetimes in UTC.
61+ """
62+ if value .tzinfo is not None :
63+ value = value .astimezone (datetime .timezone .utc )
64+ return str (value )
65+
66+
5367def convert_timedelta_in (value ):
5468 """
5569 Converts the timedelta value being passed into sqlite.
5670 """
5771 return value .total_seconds ()
5872
5973
74+ # Out
75+
76+
6077def convert_numeric_out (value : bytes ) -> Decimal :
6178 """
6279 Convert float values into Decimals.
@@ -104,18 +121,28 @@ def convert_boolean_out(value: bytes) -> bool:
104121 return _value == "1"
105122
106123
124+ def convert_timestamptz_out (value : bytes ) -> datetime .datetime :
125+ """
126+ If the value is from a timstamptz column, convert it to a datetime value,
127+ with a timezone of UTC.
128+ """
129+ return datetime .datetime .fromisoformat (value .decode ("utf8" ))
130+
131+
107132sqlite3 .register_converter ("Numeric" , convert_numeric_out )
108133sqlite3 .register_converter ("Integer" , convert_int_out )
109134sqlite3 .register_converter ("UUID" , convert_uuid_out )
110135sqlite3 .register_converter ("Date" , convert_date_out )
111136sqlite3 .register_converter ("Time" , convert_time_out )
112137sqlite3 .register_converter ("Seconds" , convert_seconds_out )
113138sqlite3 .register_converter ("Boolean" , convert_boolean_out )
139+ sqlite3 .register_converter ("Timestamptz" , convert_timestamptz_out )
114140
115141sqlite3 .register_adapter (Decimal , convert_numeric_in )
116142sqlite3 .register_adapter (uuid .UUID , convert_uuid_in )
117143sqlite3 .register_adapter (datetime .time , convert_time_in )
118144sqlite3 .register_adapter (datetime .date , convert_date_in )
145+ sqlite3 .register_adapter (datetime .datetime , convert_datetime_in )
119146sqlite3 .register_adapter (datetime .timedelta , convert_timedelta_in )
120147
121148###############################################################################
0 commit comments