2017-02-16 10 views
1

Я пытаюсь вставить список кортежей в таблицу MS SQL через pyodbc с Python 3. Это работает:pyodbc: ('Парамы должны быть в списке, кортеже или Row', 'HY000') с данными NumPy

conn_string = (('DRIVER=FreeTDS;' 
       'SERVER={};' 
       'PORT=1433;' 
       'DATABASE={};' 
       'UID={};' 
       'PWD={};' 
       'TDS_Version=8.0;') 
       .format(server, db, user, pwd)) 
sql = """ 
insert into Table1(field1, field2, field3) values (?, ?, ?) 
""" 

cursor.executemany(sql, [('1175B57E-7A10-4BAC-B22E-457C8266C0F2', '1D111FA5-A65D-4F77-A3AB-78B80BAF0C0B', 2), 
('C60FA1C9-7656-4EBF-A577-44CBF0C641F4', '365FB706-9F7F-4ED4-AB88-927AE1F762A6', 1), 
('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '590E266D-810C-4DC2-BA5A-BAC05A9982C4', 0), 
('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '1D6E0C95-DF96-45D5-B8F3-211D825A160F', 0), 
('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '17D2EC66-845F-495D-9020-91E144B2E595', 0), 
('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '3A694B33-39F4-4F5B-899B-9B27810E4D82', 1), 
('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '4EE1D6F4-4A1E-4316-93D5-2AE1F461A193', 0), 
('410DE087-1ADF-4EEA-BCE6-D7A1124E2A51', '17D2EC66-845F-495D-9020-91E144B2E595', 0), 
('C60FA1C9-7656-4EBF-A577-44CBF0C641F4', '250256D4-4A3A-48E0-BCBA-7CD89011D81F', 1), 
('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '4D363718-FE0C-4257-8E4C-5C9A024BAEFF', 0)]) 

, но это не делает:

params = list(row for row in data_table.round(0).head(10).to_records(index=False)) 

cursor.executemany(sql, params) 

производит эту ошибку:

('Params must be in a list, tuple, or Row', 'HY000') 

даже если выход params является :

[('1175B57E-7A10-4BAC-B22E-457C8266C0F2', '1D111FA5-A65D-4F77-A3AB-78B80BAF0C0B', 2), 
    ('C60FA1C9-7656-4EBF-A577-44CBF0C641F4', '365FB706-9F7F-4ED4-AB88-927AE1F762A6', 1), 
    ('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '590E266D-810C-4DC2-BA5A-BAC05A9982C4', 0), 
    ('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '1D6E0C95-DF96-45D5-B8F3-211D825A160F', 0), 
    ('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '17D2EC66-845F-495D-9020-91E144B2E595', 0), 
    ('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '3A694B33-39F4-4F5B-899B-9B27810E4D82', 1), 
    ('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '4EE1D6F4-4A1E-4316-93D5-2AE1F461A193', 0), 
    ('410DE087-1ADF-4EEA-BCE6-D7A1124E2A51', '17D2EC66-845F-495D-9020-91E144B2E595', 0), 
    ('C60FA1C9-7656-4EBF-A577-44CBF0C641F4', '250256D4-4A3A-48E0-BCBA-7CD89011D81F', 1), 
    ('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '4D363718-FE0C-4257-8E4C-5C9A024BAEFF', 0)] 
+0

Просто испытание, я не могу воссоздать проблему. Что такое RDMS? – Parfait

+0

Спасибо. Это MS SQL Server 2014. Строковые поля COLLATE «SQL_Latin1_General_CP1_CI_AS», если это помогает. –

+0

Что у вас есть в params - это список, и список не может быть передан как аргумент функции. Попробуйте изменить его как 'params = (('A', 'B', 2), ('C', 'D', 1), ('E', 'F', 0))' и дайте мне знать –

ответ

0

Как указано в комментариях к этому вопросу, проблема в том, что

cursor.executemany(sql, params) 

терпел неудачу, потому что

params = list(row for row in data_table.round(0).head(10).to_records(index=False)) 

не возвращает список «список [ы ], tuple [s] или [pyodbc] Row [s] ", он возвращал список" numpy.records ". Решение было преобразовать «запись», так что params содержал список кортежей:

params = list(tuple(row) for row in data_table.head(10).values) 

 Смежные вопросы

  • Нет связанных вопросов^_^