使用SQLite3进行动态SQL查询

h7wcgrx3  于 2023-02-05  发布在  SQLite
关注(0)|答案(1)|浏览(396)

我想允许用户查询sql数据库,数据库为here
因此,用户将能够输入他们想要的查询:

csr_city= input("Enter a city >>").lower().strip().replace(' ','')
csr_type = input("Enter a type >>").lower().strip()

然后执行查询:

cur = conn.cursor()
cur.execute('SELECT * FROM crime_scene_report WHERE city=?  AND type=? ', (csr_city,csr_type))
rows = cur.fetchall()
rows

如果用户同时输入city='SQL City'type='murder'这两个变量,它会在同一行中找到这两个值,但如果用户保留一个空的ex类型,则它会返回一个空表,因为这两个条件不在同一行中。
我想做的是让SELECT忽略空的变量。我想我可以用if语句来做,但那会造成混乱??有没有更好的方法?
我试过How to ignore the condition that user did not pass in SQLITE?,但对我不起作用,仍然得到空表。

yjghlzjz

yjghlzjz1#

您实际上是在寻找一个SQL查询构建器(比如SQLAlchemy的核心层),但是开始,一些if就足够了:

csr_city = input("Enter a city >>").lower().strip().replace(" ", "")
csr_type = input("Enter a type >>").lower().strip()

cur = conn.cursor()

sql_where = []
args = []
if csr_city:
    sql_where.append("city = ?")
    args.append(csr_city)
if csr_type:
    sql_where.append("type = ?")
    args.append(csr_type)

if not sql_where:
    sql_where.append("1 = 1")  # always true

sql_query = f'SELECT * FROM crime_scene_report WHERE {" AND ".join(sql_where)}'
cur.execute(sql_query, args)
rows = cur.fetchall()

相关问题