#python #sql-server #azure-sql-database #pyodbc
Вопрос:
Это скрипт, написанный для анализа репутации файлов по хэшу файла. Хэш файла берется из базы данных SQL Azure и анализируется с помощью вызова API, а результат снова вводится в базу данных. Я использую драйвер ODBC 17 для SQL Server.
Я получаю ошибку при повторном вводе данных в базу данных.
# Scanning files
def fileScan():
select_sql = "SELECT source_hash FROM [Downloads]"
crsr.execute(select_sql)
rows = crsr.fetchall()
# Read all rows
for row in rows:
print(''.join(row))
response = vt.get_file_report(''.join(row))
time.sleep(15)
source_hash = row
md5 = json.dumps(response['results']['md5'])
sha1 = json.dumps(response['results']['sha1'])
sha256 = json.dumps(response['results']['sha256'])
detections = json.dumps(response['results']['positives'])
query = (
"UPDATE Downloads SET md5=(?), sha1=(?), sha256=(?), detections=(?)"
"WHERE source_hash=(?)")
crsr.execute(query, (md5,sha1,sha256,detections,source_hash))
crsr.commit()
Ниже приведена ошибка.
461a26ad4219ea5e504fcdd1a61beb80b1a7fba8ff760e6696aa8cc3a3937887-это хэш-значение, полученное из базы данных для анализа.
Тип данных source_hash в базе данных-VARCHAR(1024).
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]
Column, parameter, or variable #5: Cannot find data type 461a26ad4219ea5e504fcdd1a61beb80b1a7fba8ff760e6696aa8cc3a3937887. (2715)
(SQLExecDirectW); [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Statement(s) could not be prepared. (8180);
[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Parameter or variable '@P5' has an invalid data type. (2724)")
Хотя подобные ошибки публикуются во многих источниках, точное решение не было упомянуто.
Комментарии:
1. Переменная
source_hash
Python является ссылкой на строку. Вы пробовалиsource_hash = row.source_hash
вместо этого?
Ответ №1:
В соответствии с показанной ошибкой,
Parameter or variable '@P5' has an invalid data type. (2724)")
source_hash в SQL-запросе (рядом с предложением WHERE) ожидает чего-то (либо строки, либо int), но ваша переменная source_hash не указывает точный тип данных и в коде, который вы использовали ''.join(raw)
и source_hash = raw
. Это означает, что необработанная переменная может быть списком или кортежем, если ваш код успешно скомпилирован для этой части.
Например,
..... WHERE source_hash = "452dferasd5481asd5"
это то, что ожидает SQL-запрос, но переменная source_hash может быть списком или кортежем,
['452dferasd5481asd5','',...] or ('452dferasd5481asd5', '',...)
Итак, попробуйте распечатать переменную source_hash, чтобы проверить ее тип данных. если он отображается, как в приведенном примере, вы можете использовать source_hash[0]
его для его получения.