SQLite Python 3 вставить синтаксис OperationalError
Итак, у меня есть функция, которая читает текст, анализирует и загружает его в таблицу SQL.
def main():
connection = sqlite3.connect("myTable.db")
crsr = connection.cursor()
lines = open("LLA03132A.txt", "r").readlines()
input = Thpt(lines)
sql = """CREATE table if not exists my_table (
date STRING,
site STRING,
sector STRING,
avg_thpt FLOAT
);"""
crsr.execute(sql)
for x in input:
time = x[0]
site = x[1][1:8]
sector = x[1]
avg_thpt = x[2]
sql = """INSERT INTO my_table VALUES ( %s , %s , %s , %f );"""%(time, site, sector, avg_thpt)
print(sql)
crsr.execute(sql)
connection.commit()
connection.close()
Однако, когда я звоню, я получаю эту ошибку. Что я делаю неправильно? Я неправильно назвал мои категории или мои ценности? Есть ли где-нибудь скрытый персонаж? Я использую пакет datetime, а также к вашему сведению
Traceback (most recent call last):
INSERT INTO my_table VALUES ( 2018-07-03 10:14:18.060416 , LA03132 , LLA03132A11 , 2637.806265 );
File "C:/Users/myname/PycharmProjects/Parser/parser2.py", line 60, in <module>
main()
File "C:/Users/myname/PycharmProjects/Parser/parser2.py", line 55, in main
crsr.execute(sql)
sqlite3.OperationalError: near "10": syntax error
2 ответа
Вы используете интерполяцию строк, которая является медленной и небезопасной, когда вместо этого следует использовать передачу параметров.
Также sqlite3.paramstyle
является 'qmark'
так что вы должны использовать ?
в качестве заполнителя для ваших параметров:
params = (x[0], x[1][1:8], x[1], x[2])
sql = """INSERT INTO my_table VALUES (?, ?, ?, ?);"""
print(sql)
crsr.execute(sql, params)
Обратите внимание, что sql и параметры передаются драйверу отдельно, поэтому задача базы данных - выполнить интерполяцию параметров. Это освобождает вас от адских кавычек и делает ваш код более безопасным, так как не допускает SQL-инъекций. Это также быстрее.
Проблема в том, что вы пытаетесь вставить STRING
значения в базу данных без соответствующей цитаты. Если вы посмотрите на свой INSERT
заявление, которое печатается, оно печатает:
INSERT INTO my_table VALUES ( 2018-07-03 10:14:18.060416 , LA03132 , LLA03132A11 , 2637.806265 );
То, что вы хотите, это для печати:
INSERT INTO my_table VALUES ( '2018-07-03 10:14:18.060416' , 'LA03132' , 'LLA03132A11' , 2637.806265 );
Так что вам нужно изменить эту строку кода:
sql = """INSERT INTO my_table VALUES ( %s , %s , %s , %f );"""%(time, site, sector, avg_thpt)
к этому:
sql = """INSERT INTO my_table VALUES ( '%s' , '%s' , '%s' , %f );"""%(time, site, sector, avg_thpt)