I would like to implement list of dict data to be loaded into SQL Server DB using pytds
tablevalueparams tvp
in my python code. \
I tried below mentioned code and it's not working as expected.
def call_sproc(val):
server = 'my_server'
user = 'my_user'
password = 'secret'
database = 'my_db'
try:
conn = pytds.connect(server=server, user=user, password=password, database=database)
cursor = conn.cursor()
tvp = pytds.TableValuedParam(type_name='dbo.tbl', rows=val)
cursor.callproc("dbo.stproc", (tvp,))
conn.commit()
cursor.close()
conn.close()
except pytds.Error as e:
print("Connection issue:", e)
###
val=[{'id': 'st001', 'name':'abc'}, {'id': 'st002', 'name':'pqr'}, {'id': 'st003', 'name':'xyz'}]
call_sproc(val)
**Error: **
Traceback (most recent call last):
File "c:/Users/mydesk/Desktop/test/insertpytds.py", line 60, in
connect_and_call_stored_procedure(val)
File "c:/Users/mydesk/Desktop/test/insertpytds.py", line 23, in call_sproc
cursor.callproc("[dbo].[stproc]", (tvp,))
File "C:\Program Files (x86)\Python38-32\lib\site-packages\pytds_init_.py", line 597, in callproc
return self.callproc(procname, parameters)
File "C:\Program Files (x86)\Python38-32\lib\site-packages\pytds_init.py", line 562, in _callproc
self._exec_with_retry(lambda: self.session.submit_rpc(procname, parameters, 0))
File "C:\Program Files (x86)\Python38-32\lib\site-packages\pytds_init.py", line 668, in exec_with_retry
return fun()
File "C:\Program Files (x86)\Python38-32\lib\site-packages\pytds_init.py", line 562, in
self._exec_with_retry(lambda: self._session.submit_rpc(procname, parameters, 0))
File "C:\Program Files (x86)\Python38-32\lib\site-packages\pytds\tds.py", line 1032, in submit_rpc
serializer.write(w, param.value)
File "C:\Program Files (x86)\Python38-32\lib\site-packages\pytds\tds_types.py", line 2302, in write
self._columns_serializers[i].write(w, row[I])
KeyError: 0
I tried with list of tuples and it is working fine. But due to the risk in inserting the data wrongly in DB columns when interchange the positions in data (ex: interchange col1 to col3). I suppose list of dict data can be properly fit as per the keys in DB cols.