Python - 通过传递多个参数从 sqlite 表中选择
Posted
技术标签:
【中文标题】Python - 通过传递多个参数从 sqlite 表中选择【英文标题】:Python - Select from sqlite tables by passing multiple arguments 【发布时间】:2020-02-25 11:53:19 【问题描述】:我正在尝试在 Flask 和 SQLite 中构建一个 webapp,并且我有一个包含以下列的表:日期、国家和名称,并且我正在对这些数据做一个请求表
country = request.form.getlist('country')
name = request.form.getlist('name')
str_from_date = request.form.get('from_date')
str_to_date = request.form.get('to_date')
from_date = dt.datetime.strptime(str_from_date, '%d/%m/%Y')
to_date = dt.datetime.strptime(str_to_date, '%d/%m/%Y')
我正在尝试将这些参数传递给 sql select 语句 即
SELECT * FROM table WHERE country_col IN country AND name_col IN name
AND date(date_col) >= from_date AND date(date_col) <= to_date
但是当传递多个参数时我找不到一种方法,所以现在我所拥有的就是这个,因为 cur.execute 不接受多个参数
sql = 'SELECT * FROM table WHERE country_col IN (co) ORDER BY datetime(date_col) ASC'.format(co=','.join(['?'] * len(country)))
data = cur.execute(sql, country).fetchall()
我想要一种方法,可以将多个参数传递到 sql select 语句中,以便相应地查询数据
【问题讨论】:
【参考方案1】:我想到的第一种方法是手动生成查询:
country =
"col": col1,
"type": None,
"q": "IN",
"data": request.form.getlist('country')
name =
"col": col2,
"type": None,
"q": "IN",
"data": request.form.getlist('name')
str_from_date = request.form.get('from_date')
str_to_date = request.form.get('to_date')
from_date =
"col": col3,
"type": "date",
"q": ">=",
"data": dt.datetime.strptime(str_from_date, '%d/%m/%Y')
to_date =
"col": col4,
"type": "date",
"q": "<=",
"data": dt.datetime.strptime(str_to_date, '%d/%m/%Y')
all_data = [country, name_col, from_date, to_date]
q = "SELECT * FROM table WHERE "
for i, d in enumerate():
_col = f"date(d['col'])" if d["type"] == "date" else d["col"]
q += f"'AND ' if i > 0 else ''d['col'] d['q'] (['?'] * len(d['data'])) "
data = cur.execute(q, [d["data"] for d in all_data]).fetchall()
我不知道这是否是理想的方法,但我想它会奏效。
【讨论】:
【参考方案2】:您可以针对您的 SQLite 实例而不是 Python 运行 SQL。这样更容易发现 SQL 语句的问题 - 减少一层。
我发现您的查询语法存在潜在问题。当使用country
时,Python 会将Canada
、Poland
作为字符串。但是 SQLite 期望值应该是 'Canada'
、'Poland'
。
除此之外,IN
运算符检查提供的列表中是否存在字段 - 这就是为什么您需要 (
、)
- 用一个元素构造列表。这里更好的运营商是=
。
如果我要接触运营商...请阅读BETWEEN
here。
接下来。我不确定from_date
/ to_date
列中存储了什么。请阅读SQLite docs以确保它是否正确使用。
因此,我希望看到建议的更改:
sql = f"""SELECT *
FROM table
WHERE country_col = 'country'
AND name_col = 'name'
AND date(date_col) BETWEEN 'from_date' AND 'to_date'"""
更新
传递数组。让我们从基本的 SQL 开始:
select * from table where country_col in ('Poland', 'Canada', 'Germany')
要了解更多信息,请查看this 网站。请记住,字符串应该用'
包围。有时也可以是"
,但对于PostgreSQL,"col"
- 表示列名col
,而'col'
表示字符串col
。所以你的IN
运营商是对的!
现在从 Python 开始 - 你需要准备带有国家名称的字符串,每个都用 '
包围:
countries = ['Poland', 'Germany', 'France']
param = ", ".join([f"'x'" for x in countries])
join
连接传递列表中的字符串,内部comprehension 将'
添加到列表的每个项目。
一起:
countries = ['Poland', 'Germany', 'France']
param = ", ".join([f"'x'" for x in countries])
sql = f"""SELECT *
FROM table
WHERE country_col in (param)'
AND name_col = 'name'
AND date(date_col) BETWEEN 'from_date' AND 'to_date'"""
【讨论】:
您好,感谢您的帮助。这更有意义。但是,我仍然有如何将多个数组传递到我不知道如何解决的sql语句中的问题。我将不胜感激任何帮助。还有,不介意回答的话,sql语句前面的f是什么意思?以上是关于Python - 通过传递多个参数从 sqlite 表中选择的主要内容,如果未能解决你的问题,请参考以下文章
您如何通过传递参数从fllite中显示来自sqlite的特定数据