Код Python, пытающийся сохранить данные Excel в базе данных - ошибка при экранировании специальных символов - PullRequest
0 голосов
/ 16 сентября 2018

Может кто-нибудь, пожалуйста, помогите мне? Я пытаюсь прочитать данные из файла Excel, сохранить все в файл базы данных, затем запросить базу данных и распечатать все атрибуты имени. Я использую Python с sqlite3.

В строках моего Excel есть специальные символы, поэтому я пытаюсь избежать их. Мне не нужны специальные символы. Я искал решение в Google, но не мог найти, как это сделать. Я все еще новичок в питоне и базах данных.

Я получил это сообщение об ошибке:

enter image description here

Когда я сохранил все данные без "re.escape", я получил это сообщение об ошибке:

OperationalError: около "6": синтаксическая ошибка

Это все содержимое hamburgers.xlsx: Excel file

import re
import openpyxl
import sqlite3
from sqlite3 import Error

wb_ins = openpyxl.load_workbook("hamburgers.xlsx")
sheet_ins = wb_ins['Hamburger']
try:
    connection = sqlite3.connect("hamburger.db")
    print("hamburger.db created")    
except Error as e:
    print(e)

cursor = connection.cursor()
cursor.execute("DROP TABLE IF EXISTS hamburger")

sql = """CREATE TABLE hamburger (
    last_found Date,
    name char(10),
    stored number(4),
    hamb_id char(30) PRIMARY KEY);"""

cursor.execute(sql)

for row in sheet_ins.iter_rows(min_row=2, max_row=4):
    last_found = row[0].value
    name = re.escape(row[1].value)
    stored = row[2].value
    hamb_id= re.escape(row[3].value)

    cursor.execute("INSERT INTO hamburger VALUES('{lf}', '{n}', '{s}', '{hid}');".format(lf=last_found, n=name, s=stored, hid=hamb_id))

cursor.execute("SELECT name FROM hamburger")
name = cursor.fetchall()
print(name)

1 Ответ

0 голосов
/ 16 сентября 2018

Не используйте re.escape и не используйте форматирование строк с запросами SQL, что в любом случае является (очень) плохой практикой, поскольку подвергает ваш код SQL-инъекциям.

Например, если кто-тодолжны были предоставить вам лист Excel, содержащий строку, где hamb_id равно fake_hamb_id'); DROP TABLE hamburger; --, тогда ваш код выполнит запрос:

INSERT INTO hamburger VALUES('1', '2', '3', 'fake_hamb_id'); DROP TABLE hamburger; --');

, который в этом случае «просто» удаляет гамбургеры из БД, нос таким же успехом можно выполнить

SELECT * FROM your_users_table;

Вместо использовать параметризованный запрос:

last_found = row[0].value
name = row[1].value
stored = row[2].value
hamb_id= row[3].value

cursor.execute("INSERT INTO hamburger VALUES(?, ?, ?, ?);",
               (last_found, name, stored, hamb_id))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...