1414from piccolo .engine .exceptions import TransactionError
1515from piccolo .query .base import Query
1616from piccolo .querystring import QueryString
17+
18+ from piccolo .utils .encoding import dump_json , load_json
1719from piccolo .utils .sync import run_sync
1820
1921###############################################################################
@@ -39,14 +41,14 @@ def convert_uuid_in(value) -> str:
3941 return str (value )
4042
4143
42- def convert_time_in (value ) -> str :
44+ def convert_time_in (value : datetime . time ) -> str :
4345 """
4446 Converts the time value being passed into sqlite.
4547 """
4648 return value .isoformat ()
4749
4850
49- def convert_date_in (value ):
51+ def convert_date_in (value : datetime . date ):
5052 """
5153 Converts the date value being passed into sqlite.
5254 """
@@ -64,13 +66,24 @@ def convert_datetime_in(value: datetime.datetime) -> str:
6466 return str (value )
6567
6668
67- def convert_timedelta_in (value ):
69+ def convert_timedelta_in (value : datetime . timedelta ):
6870 """
6971 Converts the timedelta value being passed into sqlite.
7072 """
7173 return value .total_seconds ()
7274
7375
76+ def convert_array_in (value : list ):
77+ """
78+ Converts a list value into a string.
79+ """
80+ if len (value ) > 0 :
81+ if type (value [0 ]) not in [str , int , float ]:
82+ raise ValueError ("Can only serialise str, int and float." )
83+
84+ return dump_json (value )
85+
86+
7487# Out
7588
7689
@@ -129,6 +142,14 @@ def convert_timestamptz_out(value: bytes) -> datetime.datetime:
129142 return datetime .datetime .fromisoformat (value .decode ("utf8" ))
130143
131144
145+ def convert_array_out (value : bytes ) -> t .List :
146+ """
147+ If the value if from an array column, deserialise the string back into a
148+ list.
149+ """
150+ return load_json (value .decode ("utf8" ))
151+
152+
132153sqlite3 .register_converter ("Numeric" , convert_numeric_out )
133154sqlite3 .register_converter ("Integer" , convert_int_out )
134155sqlite3 .register_converter ("UUID" , convert_uuid_out )
@@ -137,13 +158,15 @@ def convert_timestamptz_out(value: bytes) -> datetime.datetime:
137158sqlite3 .register_converter ("Seconds" , convert_seconds_out )
138159sqlite3 .register_converter ("Boolean" , convert_boolean_out )
139160sqlite3 .register_converter ("Timestamptz" , convert_timestamptz_out )
161+ sqlite3 .register_converter ("Array" , convert_array_out )
140162
141163sqlite3 .register_adapter (Decimal , convert_numeric_in )
142164sqlite3 .register_adapter (uuid .UUID , convert_uuid_in )
143165sqlite3 .register_adapter (datetime .time , convert_time_in )
144166sqlite3 .register_adapter (datetime .date , convert_date_in )
145167sqlite3 .register_adapter (datetime .datetime , convert_datetime_in )
146168sqlite3 .register_adapter (datetime .timedelta , convert_timedelta_in )
169+ sqlite3 .register_adapter (list , convert_array_in )
147170
148171###############################################################################
149172
0 commit comments