首页 > 解决方案 > 使用python和sqlite时将变量输入选择

问题描述

我有一个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])

标签: pythonsqlite

解决方案


来自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

推荐阅读