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 会将CanadaPoland 作为字符串。但是 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的特定数据

Python Sqlite UPDATE多个值

将多个参数从 c# 传递给 python

如何通过 React Context 传递多个参数(从消费者到提供者)?

使用python在sqlite数据库上并发

通过 Python 脚本将多个输入传递给 .bat 文件