2

私は単純な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のタプルになるはずです。

ありがとう!

4

1 に答える 1

2

まず、データベーススキーマを定義する必要があります。最も一般的なアプローチは、次のような完全に正規化されたデータベースを作成することです。

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句のほぼ全体を動的に作成して追加する必要があります。

これに取り組むために、いくつかの優れたSQLiteGUIを入手することを強くお勧めします。WindowsではSQLiteExpertPersonalが優れており、Linuxではsqliteman優れています。

データベースにデータが入力され、数百行を超える行が含まれるようになったら、適切なインデックスを追加して、高速に動作するようにする必要があります。幸運を!

于 2012-12-29T09:11:43.187 に答える