过滤sqlite-逐一执行操作 - python

我正在研究一个与简单的sqlite数据库交互的Python程序。我正在尝试构建一个搜索工具,该工具将能够根据用户输入交互地“过滤”数据库,然后返回与搜索匹配的行(项目)。例如...

我的Python程序(通过if语句,cgi.FieldStorage()和whatnot)应该能够接受用户输入,然后遍历数据库。这是程序的一般代码:

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_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...

通过动态构造SQL语句,几乎必须动态构建和添加整个WHERE子句。

我强烈建议您获取一些好的SQLite GUI来解决此问题。在Windows上,SQLite Expert Personal很棒,而在Linux sqliteman上很棒。

一旦填充了数据库并且该数据库的行数超过了几百个,就应该添加适当的索引,这样它才能快速运行。祝好运!

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

Python ThreadPoolExecutor抑制异常 - python

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…