我有一个名为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])
答案 0 :(得分:0)
请使用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