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),有没有更优化的形式?

4

1 回答 1

1

如果这都是为了检索“客户”表的内容,那么你做错了。SELECT 会给你一个没有间隙的表;因此,如果使用的唯一 ID 是 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 的库。

于 2012-05-05T14:40:59.390 回答