2012-05-05 13 views
1

は、:Searchデータベース

from os import system as cmd 
from time import sleep as sleep 
try: 
    from sqlite3 import dbapi2 as sqlite 
except ImportError: 
    from pysqlite2 import dbapi2 as sqlite 

class search_db: 
    def __init__(self, db, name): 
     self.db = db_connection 
     self.name = name 
     self.dbc = self.db.cursor() 

    def __getitem__(self, item): 
     self.dbc.execute("select * from %s limit %s, 1" % (self.name, item)) 
     return self.dbc.fetchone() 

def search(): 
    customer_id = [] 
    customer_ids = search_db(db_connection, "customers") 
    for i in range(10000): 
     if not "None" in str(customer_ids[i]): customer_id.append(customer_ids[i]) 
    return customer_id 

## init ## 
db_name = 'customers' 
db_connection = sqlite.connect('program.db') 
db_curs = db_connection.cursor() 

search() 

確かに、それは素晴らしい何もない、と私はおそらくそれを最適化することができ知っていますもっともっともっと。ご覧のとおり、私はデータベースの検索方法を見つけようと努力してきました。私はデータベース内の情報を含むエントリーを取り出すことができました。これはエントリー番号を引き出します。私はループを使用して、 "GGS-number"というエントリの追加リスト値を検索し、正規表現を使用して行番号を抽出し、GGS番号が適用される顧客に関連する情報を印刷することを考えました。どのように私はより良い方法でこれを行うことができた誰もが任意のアイデアを持っていますか?また、私は範囲(10000)に私がいる、これのより最適化された形式はありますか?

+0

私はあなたが何をしているかを見るためにコピーして過去と実行しなければならないでしょう。これは、スタックオーバーフローが原因ではありません。 ** one ** quesitonでコードを少なくしてください。 – Shep

+0

@Shep Done :)しかし、私が知る限り、できる限り多くを剥奪した。私はただ一つの質問をしています。 – abkai

+0

ねえ、コードははるかによく見えます。私は「私が言うことができる限り、私はただ一つの質問をしています」と少し気になります。私は2つを数えます。しかしどちらの場合でも重要なことは、あなたが求めている質問を知っていることです。あなたが何を求めているのか混乱しているなら、私たちはおそらくそうなるでしょう。 – Shep

答えて

1

これはすべて、テーブル "customers"の内容を取得するためのものであれば間違っています。 SELECTはギャップのないテーブルを提供します。したがって、使用されている唯一のIDが10と101の場合、クエリ結果の長さは2になり、行0と1に2つの既存のレコードが含まれます。空のレコードをスキップしようとしているようですが、 。

しかし、あなたはこれを非常に複雑にしています。エミュレートする間違った例を選択しました。あなたが持っているものは、テーブルからn番目の行を返すSELECTクエリを実行し、非常に遅い配列を扱っているようなふりをすることができるクラスにラップされます。それを離れてやり直してください。

あなたがcustomersテーブルの内容全体をしたい場合は、単一のクエリを使用してfetchall()でそれらを取得:

import sqlite3 
conn = sqlite3.connect('program.db') 
curs = conn.cursor() 
ro = curs.execute('select * from customers') 
customers = ro.fetchall() 

あなたが特定のレコードを取得する必要がある場合は、WHEREを追加することによって、データベースがそれを処理させます句をクエリに追加します。ほとんどの場合、テーブル内の位置ではなく、ID(またはその他の属性)でレコードを取得します。

私のアドバイス:python/sqliteスキャフォールディングを最小限に抑えてください。接続を設定する、クエリを実行する、結果を1つずつ、またはすべて一緒に取得する。それで全部です。そしてcurs.rowcountを使用して、それらをフェッチする前にいくつの結果行があるか調べます。適切なSQLコマンドを使用すると、他のすべてがより簡単かつ効率的に実行されます。だから、Pythonのライブラリではなく、SQLで読む。

+0

ありがとうございます!私のプログラムではコマンドの実行時間が半分になりました。私はw3schools SQLチュートリアルを取りました。あなたのコードが何をしているのかを理解する。ありがとうございました ! :) – abkai