ввод переменной в select при использовании python и sqlite - PullRequest
0 голосов
/ 20 мая 2019

У меня есть sqlite db с именем clients.db с таблицей с именем prices. Внутри таблицы у меня есть столбцы ['date', 'xyz', 'abc', 'sta, 'vert']. Я обращаюсь к базе данных из Python 3.

Я могу достаточно легко получить конкретный номер, используя:

conn = sqlite3.connect('clients.db')
c = conn.cursor()

c.execute('''SELECT "xyz" FROM prices WHERE date=?''', ('2019-01-07', ))
conn.close()

print(c.fetchone()[0])

Возвращает 1902, как и ожидалось.

Однако, когда я пытаюсь описать ниже, вместо ожидаемого числа я получаю xyz.

conn = sqlite3.connect('clients.db')
c = conn.cursor()

c.execute('''SELECT ? FROM prices WHERE date=?''', ('xyz', '2019-01-07', ))
conn.close()

print(c.fetchone()[0])

и когда я добавляю a =?, я получаю sqlite3.OperationalError: near "=": syntax error:

conn = sqlite3.connect('clients.db')
c = conn.cursor()

c.execute('''SELECT =? FROM prices WHERE date=?''', ('xyz', '2019-01-07', ))
conn.close()

print(c.fetchone()[0])

1 Ответ

0 голосов
/ 20 мая 2019

С Документация Python :

Вместо этого используйте подстановку параметров DB-API. Положил ? как заполнитель везде, где вы хотите использовать значение, а затем предоставить кортеж значений в качестве второго аргумента метода execute () курсора.

Вам необходимо использовать ? заполнитель для значений, но для имен столбцов вы можете использовать форматирование строки.

Я создал класс, вставил несколько фиктивных строк и выполнил запрос на выборку, который упоминается в вопросе.

import sqlite3

class Database(object):
    def __init__(self):
        self.conn = sqlite3.connect('clients.db')
        self.c = self.conn.cursor()

    def create_table(self):
        try:
            self.c.execute('''CREATE TABLE prices (date text, xyz text, abc text, sta text, vert text)''')
        except:
            pass

    def insert_dummy_rows(self):        
        values = [('2019-01-07', 'xyz1', 'abc1', 'sta1', 'vert1'),
                     ('2019-01-07', 'xyz2', 'abc2', 'sta2', 'vert2'),
                     ('2019-01-08', 'xyz3', 'abc3', 'sta3', 'vert3'),
                    ]
        self.c.executemany('INSERT INTO prices VALUES (?,?,?,?,?)', values)
        self.conn.commit()

    def close_connection(self):
        self.conn.close()

    def get_single_row(self):
        t = ('2019-01-07',)
        query = "SELECT {} FROM prices WHERE date=?".format('xyz')
        self.c.execute(query, t)
        return self.c.fetchone()[0]

if __name__ == '__main__':
    db = Database()
    db.create_table()
    db.insert_dummy_rows()
    print(db.get_single_row())

Выход:

xyz1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...