Почему я не могу использовать переменные (используя «% s» или «?») Для ссылки на имена таблиц и столбцов в sqlite «СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ» и «ВСТАВИТЬ В ЗНАЧЕНИЯ»? - PullRequest
1 голос
/ 06 августа 2020

Я создаю класс базы данных для своего приложения, так как таблицы базы данных мне понадобятся в разных случаях. Я использую sqlite3, и мне нужно, чтобы мой код был как можно более универсальным c, но когда я использовал «% s» и / или «?» для имени таблицы и заголовков столбцов я получил вышеупомянутую ошибку.

Вот мой код:

import sqlite3

conn = sqlite3.connect("cows.db")
c = conn.cursor()


class databases:
    global c

    def __init__(self, table_name):
        self.table_name = table_name

    def create_table(self, *args, **kwargs):
        c.execute('CREATE TABLE IF NOT EXISTS %s(%s)', (self.table_name, args))
        c.execute("INSERT INTO %s VALUES (%s)", (self.table_name, kwargs))
        conn.commit()

    def delete_record(self, *args):
        c.execute(''' DELETE FROM ? WHERE ? = ?''', (self.table_name, args))
        conn.commit()


cows = databases('cow')
cows.create_table('cow_id REAL', 'lactation_phase TEXT', 'milk_production REAL', 'weight REAL')

Вот сообщение об ошибке:

C:\Users\farid\PycharmProjects\cownutritionmanagmentsystem\venv\Scripts\python.exe C:/Users/farid/PycharmProjects/cownutritionmanagmentsystem/database.py
Traceback (most recent call last):
  File "C:/Users/farid/PycharmProjects/cownutritionmanagmentsystem/database.py", line 24, in <module>
    cows.create_table('cow_id REAL', 'lactation_phase TEXT', 'milk_production REAL', 'weight REAL')
  File "C:/Users/farid/PycharmProjects/cownutritionmanagmentsystem/database.py", line 14, in create_table
    c.execute('CREATE TABLE IF NOT EXISTS %s(%s)', (self.table_name, args))
sqlite3.OperationalError: near "%": syntax error

1 Ответ

0 голосов
/ 06 августа 2020

Вы можете использовать %s для ссылки на имя таблицы или другие переменные в строке. Обратите внимание на маркер %s для вставки строки и маркер %d для вставки целого числа.

В качестве альтернативы вы также можете использовать метод format для замены значения переменной в строке. В методе format фигурные скобки показывают, где должно быть вставленное значение go. Вы можете вставить несколько значений с помощью этого метода, и значения не обязательно должны быть только строками, это могут быть числа и другие Python объекты.

import sqlite3

conn = sqlite3.connect("cows.db")
c = conn.cursor()


class databases:
    global c

    def __init__(self, table_name):
        self.table_name = table_name

    def create_table(self, *args, **kwargs):
        c.execute('CREATE TABLE IF NOT EXISTS %s(%s)' % (self.table_name, args))
        c.execute("INSERT INTO %s VALUES (%s)" % (self.table_name, kwargs)) # Notice how we have used % operator here
        conn.commit()

    def delete_record(self, *args):
        c.execute(''' DELETE FROM {} WHERE {} = {}'''.format(self.table_name, args)) # We have used format method here
        conn.commit()


cows = databases('cow')
cows.create_table('cow_id REAL', 'lactation_phase TEXT', 'milk_production REAL', 'weight REAL')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...