Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 过滤sqlite-逐个执行操作_Python_Sql_Sqlite_Cgi - Fatal编程技术网

Python 过滤sqlite-逐个执行操作

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

我正在开发一个与一个简单的sqlite数据库交互的Python程序。我正在尝试构建一个搜索工具,它能够根据用户输入,以交互方式“过滤”数据库,然后返回与搜索匹配的行(项)。例如

我的Python程序(通过if语句、cgi.FieldStorage()和诸如此类的语句)应该能够接受用户输入,然后搜索数据库。以下是该程序的通用代码:

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中,您可以为准备好的语句构建参数的动态数组来实现这一点