【问题标题】:Python-sqlite3 : How to put a python variable in SELECT statementPython-sqlite3:如何在 SELECT 语句中放置一个 python 变量
【发布时间】:2021-05-29 11:25:48
【问题描述】:

如何在 SELECT 之后放置一个 python 变量。这个想法是创建一个带有三个参数的 python 函数,你可以在其中选择你是什么(这里是年龄)来自谁(这里是 Mike 和 James)

conn = sqlite3.connect('test.s3db')
cur = conn.cursor()
cur.execute('''DROP TABLE IF EXISTS people''')
cur.execute('''CREATE TABLE IF NOT EXISTS people
                (id INTEGER,
                 name TEXT,
                 surname TEXT,
                 age INTEGER,
                 alone INTEGER DEFAULT 0);''')

def add_people(id, name, surname, age, alone=0):
    cur.executemany('INSERT INTO people (id, name, surname, age, alone) VALUES (?,?,?,?,?)', [(id, name, surname, age, alone)])
    conn.commit()

add_people(1, 'SMITH','James',45)
add_people(2,'JOHNSON','Mike',75)

cur.execute('''SELECT (?) FROM people WHERE surname = (?) OR surname = (?)''', ('age','Mike', 'James'))
print(cur.fetchall())

我的代码return

[('age',), ('age',)]

而不是:

[(75,), (45,)]

编辑:我希望选择的是一个变量,而不是直接写在查询中。我的目标是制作这样的功能:

def query(what, who_1, who_2):
    cur.executemany('''SELECT (?) FROM people WHERE surname = (?) OR  surname = (?)''', (what, who_1, who_2))
    return cur.fetchall()

提前感谢您的回答!

【问题讨论】:

  • 如此处所写,executemany 所做的只是 execute 将和 global 没有必要。
  • 确实,“全局”在这里毫无用处。我知道 execute() 仅适用于一个变量,我必须使用 executemany() 来使用多个变量,但我可能错了。

标签: python sql database sqlite


【解决方案1】:

这会将您需要的数据作为 select_data_of 的参数

import sqlite3


def add_people(id, name, surname, age, alone=0):
    cur.executemany('INSERT INTO people (id, name, surname, age, alone) VALUES (?,?,?,?,?)', [(id, name, surname, age, alone)])
    conn.commit()


def select_data_of(names, data="age"):
    select = []
    for name in names:
        cur.execute(f'''SELECT [{data}] FROM people WHERE surname = (?)''', (name, ))
        select.append(cur.fetchall()[0])
    return select


with sqlite3.connect('test.s3db') as conn:
    cur = conn.cursor()
    cur.execute('''DROP TABLE IF EXISTS people''')
    cur.execute('''CREATE TABLE IF NOT EXISTS people
                    (id INTEGER,
                     name TEXT,
                     surname TEXT,
                     age INTEGER,
                     alone INTEGER DEFAULT 0);''')
    add_people(2,'JOHNSON','Mike',75)
    add_people(1, 'SMITH','James',45)
    data = select_data_of(("Mike", "James"), data="age")
    print(data)

输出:

[(75,), (45,)]

【讨论】:

  • 感谢您的回答,但它没有回答我的问题。我希望“年龄”是一个变量,而不是直接写在查询中。我将编辑我的问题以使其更清楚。
  • 好的,我会尽快解决这个问题。
  • 我认为这应该满足您的需求。
【解决方案2】:

我认为由于 'ages' 参数,您的选择查询是错误的,这个新查询将起作用。

试试

cur.execute("SELECT [age] FROM people WHERE surname = 'Mike' OR surname = 'James")

【讨论】:

  • 你能详细解释一下它是如何回答这个问题的吗?
  • 我认为 select 查询完全是错误的,因为 'ages' 参数,我认为这个新查询会起作用。
  • 将此添加到您的答案@BeChillerToo
猜你喜欢
  • 1970-01-01
  • 2013-04-05
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多