SQLite Python 3 вставить синтаксис OperationalError - PullRequest
0 голосов
/ 03 июля 2018

Итак, у меня есть функция, которая читает txt, анализирует его и загружает в таблицу 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 fyi

  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 ]

0 голосов
/ 03 июля 2018

Вы используете интерполяцию строк, которая является медленной и небезопасной, когда вместо нее следует использовать передачу параметров.

Также 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-инъекций. Это также быстрее.

0 голосов
/ 03 июля 2018

Проблема заключается в том, что вы пытаетесь вставить 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)
...