我正在尝试访问特定列中的行的数据,但该函数返回列的名称而不是行值。我注意到,如果我使用星形(*)
来选择所有内容,该函数将返回所有值,而不是键,如果我手动输入我想要访问的列的名称,它也可以。
在函数中,_dict
是一个我作为参数发送的字典,它的键与数据库中的列名相同,所以我想要做的是每次循环更改为不同的键,将其转换为string,并在数据库中选择该列名的值。
def query(_dict, zipcode):
# Connection to database
conn = sqlite3.connect('mashup.db')
# Creation of cursor
cur = conn.cursor()
# Make query to database
for key in _dict:
key_name = str(key)
cur.execute("SELECT ? FROM places WHERE postal_code = ?",[key_name,zipcode])
db_query = cur.fetchone()
_dict[key] = db_query[0]
return _dict
我也尝试了cur.fetchone()
和fetchall()
,但我得到了相同的结果。
以防万一,这是我作为参数传递的字典:
# Creation of the dict of places
places_dict = {
'accuracy': '',
'admin_code1': '',
'admin_code2': '',
'admin_code3': '',
'admin_name1': '',
'admin_name2': '',
'admin_name3': '',
'country_code': '',
'latitude': '',
'longitude': '',
'place_name': '',
'postal_code': ''}
列名或表名不支持占位符(即使用?
) - 仅适用于值。所以正在发生的是你的查询变成字面意思:
SELECT 'accuracy' FROM places WHERE postal_code = '1234';
这就是为什么你得到列名而不是行中存储的值。
您需要自己格式化字符串以包含列名称,但请注意,此方法易受SQL注入攻击,因此您应确保列名称字典是可信的并包含“好”值。
例:
cur.execute("SELECT {} FROM places WHERE postal_code = ?".format(key_name), [zipcode])