2012-05-05 3 views
1

Содействуя мое исследование использования базы данных в Python, я придумал следующий код на основе Bryan Moyles отличный пример:Поиск базы данных

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() 

Конечно, это ничего не фантастическими, и я знаю, что я мог бы, вероятно, оптимизировать его чуть больше; но, как вы можете видеть, я старался выяснить, как искать базу данных. Мне удалось получить записи, содержащие информацию в базе данных, которая вытаскивает номер записи. Я думал об использовании циклов if для поиска значений добавленных списков для записи «GGS-номер», а затем с использованием регулярных выражений для извлечения номера строки, а затем для печати информации, относящейся к клиенту, к которой относится номер GGS. У кого-нибудь есть идеи, как я мог бы сделать это лучше? Кроме того, у меня есть for i in range (10000), есть ли более оптимизированная форма этого?

+0

Мне нужно было бы скопировать и пропустить и выполнить, чтобы посмотреть, что вы делаете. Это не то, что для переполнения стека. Пожалуйста, напишите меньше кода с ** одним ** quesiton, мы будем рады помочь. – Shep

+0

@ Shep Done :) Хотя, насколько я могу судить, все равно могу, насколько я могу судить; Я задаю только один вопрос. – abkai

+0

Эй, код выглядит намного лучше. Я немного беспокоюсь о «насколько я могу судить, я только задаю один вопрос». Я считаю два. Но в любом случае важно то, что вы знаете, какие вопросы вы задаете. Если вы смущены тем, о чем вы спрашиваете, мы, вероятно, тоже будем. – Shep

ответ

1

Если все это предназначено для извлечения содержимого таблицы «клиенты», вы делаете это неправильно. SELECT даст вам таблицу без пробелов; поэтому, если единственными используемыми идентификаторами являются 10 и 101, ваши результаты запроса будут иметь длину 2 и содержать две существующие записи в строках 0 и 1. Похоже, вы пытаетесь пропустить пустые записи, но их нет. ,

Но вы делаете это слишком сложным; вы выбрали неправильный пример для подражания. Вы выполнили запрос SELECT, который возвращает n-я строка из таблицы, завернутый в класс, который позволяет вам притворяться, что вы имеете дело с очень медленным массивом. Отбросьте это и начните.

Если вы хотите, чтобы все содержимое 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 были минимальными. Настройте соединение, запустите запрос, выберите результаты по одному или все вместе. Это все. И curs.rowcount, чтобы узнать, сколько строк результата есть перед их получением. Все остальное делается более просто и эффективно с помощью соответствующей команды SQL. Поэтому читайте на SQL, а не на библиотеках python.

+0

Большое спасибо! Это уменьшило время выполнения команд в моей программе, и я только что взял учебник по SQL-учебникам w3schools; и понять, что делает ваш код. Спасибо ! :) – abkai

Смежные вопросы