Python 过滤sqlite-逐个执行操作
我正在开发一个与一个简单的sqlite数据库交互的Python程序。我正在尝试构建一个搜索工具,它能够根据用户输入,以交互方式“过滤”数据库,然后返回与搜索匹配的行(项)。例如 我的Python程序(通过if语句、cgi.FieldStorage()和诸如此类的语句)应该能够接受用户输入,然后搜索数据库。以下是该程序的通用代码:Python 过滤sqlite-逐个执行操作,python,sql,sqlite,cgi,Python,Sql,Sqlite,Cgi,我正在开发一个与一个简单的sqlite数据库交互的Python程序。我正在尝试构建一个搜索工具,它能够根据用户输入,以交互方式“过滤”数据库,然后返回与搜索匹配的行(项)。例如 我的Python程序(通过if语句、cgi.FieldStorage()和诸如此类的语句)应该能够接受用户输入,然后搜索数据库。以下是该程序的通用代码: import cgitb; cgitb.enable() import cgi import sys import sqlite3 as lite import sys
import cgitb; cgitb.enable()
import cgi
import sys
import sqlite3 as lite
import sys
con = lite.connect('bikes.db')
form = cgi.FieldStorage()
terrain_get = form.getlist("terrain")
terrains = ",".join(terrain_get)
handlebar_get = form.getlist("handlebar")
handlebars = ",".join(handlebar_get)
kickstand = form['kickstand'].value
正如你所看到的,那部分就是接收用户输入的部分;(我认为)效果很好。接下来,我需要帮助的地方:
if 'dirtrocky' not in terrains:
FILTER the database to not return items that have "dirtrocky' in their terrain field
然后在程序的后面,我希望能够扩展我的过滤器:
if 'drop' not in handlebars:
FILTER the database to, much like in previous one, not return items that have 'drop' in their 'handlebar' field
我的问题是,如何过滤数据库?理想情况下,我的最终结果应该是在我“过滤”掉上述内容后剩下的行的ID元组
谢谢 首先,您应该定义数据库架构。最常见的方法是创建完全规范化的数据库,如:
CREATE TABLE bikes (
bike_id INTEGER AUTOINCREMENT PRIMARY KEY,
manufacturer VARCHAR(20),
price FLOAT,
...
);
CREATE TABLE terrains (
terrain_id INTEGER AUTOINCREMENT PRIMARY KEY,
terrain VARCHAR(20),
...
);
CREATE TABLE handlebars (
handlebar_id INTEGER AUTOINCREMENT PRIMARY KEY,
handlebar VARCHAR(20),
...
);
CREATE TABLE bike_terrain (
bike_id INTEGER,
terrain_id INTEGER
);
CREATE TABLE bike_handlebar (
bike_id INTEGER,
handlebar_id INTEGER
);
请注意,bikes
表不包含任何关于地形类型或把手的信息:这些信息将存储在连接表中,如bike\u terrain
这种完全规范化的数据库使得填充有点麻烦,但另一方面,它使查询更加容易
如何查询多值字段
您需要动态构造SQL语句,如下所示:
SELECT
b.manufacturer,
b.price
FROM bikes b,
terrains t,
bike_terrain bt
WHERE b.bike_id = bt.bike_id
AND t.terrain_id = bt.terrain_id
AND t.terrain IN ('mountain', 'dirt', ...) -- this will be built dynamically
... -- add more for handlebars, etc...
几乎整个WHERE子句都必须动态地构建和添加,方法是动态地构造SQL语句
我强烈建议使用一些好的SQLite GUI来处理这个问题。在Windows上,SQLite Expert Personal非常出色,而在Linux上,sqliteman非常出色
一旦您填充了数据库,并且它的行数超过了100行,您应该添加适当的索引,以便它能够快速工作。祝你好运 你能展示一下你心目中的数据库模式吗?您想如何存储像terrain这样的多值字段?我明白您的意思。我想我只会使用多个表。然而,在查看等的答案时,我有点不清楚如何设置。我理解主表的概念,它包括ID、标题、价格等。但是,对于多值字段,如何设置它?谢谢令人惊叹的!非常感谢。我现在就要睡觉了,希望醒来时能完全苏醒过来,准备施展魔法。或者,你知道,编程。没有真正的区别。我还要查看
sqliteman
。我已经开始输入数据库了。不过,我有点好奇如何将用户输入的数据添加到SQL语句中。是否有一种方法可以“将其分解”,以便插入各种变量?或者,我必须将各种变量/字符串组合起来,然后将它们作为一个大查询发送到最后(即a=”和“b=a+选择器,等等),这就是我通常做的——仔细构造SQL语句。请小心清理用于创建此类SQL的数据,或将准备好的语句与?
一起使用,以避免SQL注入。在python或perl中,您可以为准备好的语句构建参数的动态数组来实现这一点