Python通过传递多个参数从sqlite表中选择

2024-03-29 13:08:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在Flask和SQLite中构建一个webapp,我有一个包含列的表:Date、Country和Name,我正在对这些数据做一个请求表单

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语句中 i、 e

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语句中,以便相应地查询数据


Tags: andto数据nameinfromformsql
2条回答

我想到的第一种方法是手动生成查询:

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()

我不知道这是否是理想的方法,但我想它会起作用

可以对SQLite实例而不是Python运行SQL。这样,就更容易发现SQL语句的问题——少了一层

我发现您的查询的语法可能存在问题。当使用{country}时,Python将CanadaPoland作为字符串。但是SQLite需要的值应该是'Canada''Poland'

除此之外,IN运算符检查提供的列表中是否存在字段-这就是为什么需要()用一个元素构造列表。这里更好的运算符是=

如果我碰了操作员。。。请阅读BETWEEN{a1}

下一个。我不确定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开始:

从国家(波兰、加拿大、德国)所在的表格中选择*)

要阅读更多信息,请查看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}'"""

相关问题 更多 >