使用python和sqlite时将变量输入select

时间:2019-05-20 14:09:18

标签: python sqlite

我有一个名为clients.db的sqlite数据库,其中有一个名为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 :(得分:0)

来自Python documentation

  

请使用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