@@ -233,18 +233,19 @@ def prepare_data(
233233 output .append (tuple (parsed ))
234234 return output
235235
236- def _parse_values (self , columns : list [str ]) -> str :
236+ def _parse_select (self , columns : list [str ]) -> str :
237237 embeddings_dimension = self .embeddings_dimension
238238 parsed_values = []
239- for col in columns :
239+ for i , col in enumerate (columns ):
240+ argument_selector = f"${ i + 1 } "
240241 if col in _VECTOR_COLUMNS and embeddings_dimension :
241242 parsed_values .append (
242- f"PARSE_JSON({ self . values_delimiter } )::VECTOR(FLOAT,{ embeddings_dimension } )"
243+ f"PARSE_JSON({ argument_selector } )::VECTOR(FLOAT,{ embeddings_dimension } )"
243244 )
244245 elif col in _ARRAY_COLUMNS or col in _VECTOR_COLUMNS :
245- parsed_values .append (f"PARSE_JSON({ self . values_delimiter } )" )
246+ parsed_values .append (f"PARSE_JSON({ argument_selector } )" )
246247 else :
247- parsed_values .append (self . values_delimiter )
248+ parsed_values .append (argument_selector )
248249 return "," .join (parsed_values )
249250
250251 def upload_dataframe (self , df : "DataFrame" , file_data : FileData ) -> None :
@@ -262,10 +263,11 @@ def upload_dataframe(self, df: "DataFrame", file_data: FileData) -> None:
262263 df .replace ({np .nan : None }, inplace = True )
263264
264265 columns = list (df .columns )
265- stmt = "INSERT INTO {table_name} ({columns}) SELECT {values}" .format (
266+ stmt = "INSERT INTO {table_name} ({columns}) SELECT {select} FROM VALUES ({ values}) " .format (
266267 table_name = self .upload_config .table_name ,
267268 columns = "," .join (columns ),
268- values = self ._parse_values (columns ),
269+ select = self ._parse_select (columns ),
270+ values = "," .join ([self .values_delimiter for _ in columns ]),
269271 )
270272 logger .info (
271273 f"writing a total of { len (df )} elements via"
@@ -276,10 +278,7 @@ def upload_dataframe(self, df: "DataFrame", file_data: FileData) -> None:
276278 for rows in split_dataframe (df = df , chunk_size = self .upload_config .batch_size ):
277279 with self .connection_config .get_cursor () as cursor :
278280 values = self .prepare_data (columns , tuple (rows .itertuples (index = False , name = None )))
279- # TODO: executemany break on 'Binding data in type (list) is not supported'
280- for val in values :
281- logger .debug (f"running query: { stmt } \n with values: { val } " )
282- cursor .execute (stmt , val )
281+ cursor .executemany (stmt , values )
283282
284283
285284snowflake_source_entry = SourceRegistryEntry (
0 commit comments