对数据库的查询不返回行值,而是返回列名

问题描述 投票:1回答:1

我正在尝试访问特定列中的行的数据,但该函数返回列的名称而不是行值。我注意到,如果我使用星形(*)来选择所有内容,该函数将返回所有值,而不是键,如果我手动输入我想要访问的列的名称,它也可以。

在函数中,_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': ''}
python-3.x sqlite flask
1个回答
2
投票

列名或表名不支持占位符(即使用?) - 仅适用于值。所以正在发生的是你的查询变成字面意思:

SELECT 'accuracy' FROM places WHERE postal_code = '1234';

这就是为什么你得到列名而不是行中存储的值。

您需要自己格式化字符串以包含列名称,但请注意,此方法易受SQL注入攻击,因此您应确保列名称字典是可信的并包含“好”值。

例:

cur.execute("SELECT {} FROM places WHERE postal_code = ?".format(key_name), [zipcode])
© www.soinside.com 2019 - 2024. All rights reserved.