@@ -51,44 +51,45 @@ def execute(self, sql, parameters=None, bulk_parameters=None):
51
51
self ._result = self .connection .client .sql (sql , parameters ,
52
52
bulk_parameters )
53
53
54
- if "rows" in self ._result :
55
- transformed_result = False
56
- if "col_types" in self . _result :
57
- transformed_result = True
58
- self .rows = self .result_set_transformed ( )
54
+ if "rows" not in self ._result :
55
+ return
56
+
57
+ if "col_types" in self . _result :
58
+ self .rows = iter ( self ._transform_result_types () )
59
59
60
- if not transformed_result :
61
- self .rows = iter (self ._result ["rows" ])
60
+ else :
61
+ self .rows = iter (self ._result ["rows" ])
62
62
63
- def result_set_transformed (self ):
63
+ def _transform_result_types (self ):
64
64
"""
65
- Generator that iterates over each row from the result set
65
+ Generate row items with column values converted to their corresponding
66
+ native Python types, based on information from `col_types`.
67
+
68
+ Currently, only converting to native `datetime` objects is implemented.
66
69
"""
67
- rows_to_convert = [True if col_type == 11 or col_type == 15 else False for col_type in
68
- self ._result ["col_types" ]]
70
+ datetime_column_types = [11 , 15 ]
71
+ datetime_columns_mask = [
72
+ True if col_type in datetime_column_types else False
73
+ for col_type in self ._result ["col_types" ]
74
+ ]
69
75
for row in self ._result ["rows" ]:
70
- gen_flags = (flag for flag in rows_to_convert )
71
- yield [t_row for t_row in self ._transform_date_columns (row , gen_flags )]
76
+ yield list (self ._transform_datetime_columns (row , iter (datetime_columns_mask )))
72
77
73
78
@staticmethod
74
- def _transform_date_columns (row , gen_flags ):
79
+ def _transform_datetime_columns (row , column_flags ):
75
80
"""
76
- Generates iterates over each value from a row and converts timestamps to pandas TIMESTAMP
81
+ Convert all designated columns to native Python `datetime` objects.
77
82
"""
78
83
for value in row :
79
84
try :
80
- flag = next (gen_flags )
85
+ flag = next (column_flags )
81
86
except StopIteration :
82
87
break
83
88
84
- if not flag or value is None :
85
- yield value
86
- else :
87
- if value < 0 :
88
- yield None
89
- else :
90
- value = datetime .fromtimestamp (value / 1000 )
91
- yield value
89
+ if flag and value is not None :
90
+ value = datetime .fromtimestamp (value / 1e3 )
91
+
92
+ yield value
92
93
93
94
def executemany (self , sql , seq_of_parameters ):
94
95
"""
0 commit comments