将sqlite3行读入对象更简单的方法?

时间:2018-10-15 19:19:43

标签: python sqlite

在Python中,我正在从sqlite3中将行读取到一个简单数据结构的对象中。在分配时,我必须将行分配给一系列变量。有没有一种方法可以更简单地做到这一点?

我在下面包括了一些示例代码,希望可以说明我的问题。

import sqlite3

class studentDef(object):
    def __init__(self):
        self.firstName = 'x'
        self.lastName  = 'x'
        self.id        = 'x'
        self.address1  = 'x'
        self.address2  = 'x'
        self.city      = 'x'
        self.state     = 'x'
        self.zip       = 'x'
        self.status    = 0

def main():
    mystudent = studentDef()
    db        = sqlite3.connect('students.sqlite3')
    cursor    = db.cursor()
    selectTxt = "select * from students where status = 1"
    cursor.execute(selectTxt)
    rows = cursor.fetchall()
    for index in range(0,len(rows)):
        mystudent.firstName, mystudent.lastName, mystudent.id, mystudent.address1, \
            mystudent.address2, mystudent.city, mystudent.state, mystudent.zip, \
            mystudent.status = row[index]
        processStudent(mystudent)

if __name__ == '__main__':
    main()

我当前的代码正在阅读50列以上,并且赋值语句有些毛茸茸!在我仍在开发的过程中,在添加,删除或修改列时,我一直在弄乱赋值语句。

有没有更简单的方法来做类似的事情:

mystudent = row[index]

我的另一个问题是我正在另外5个程序中执行此操作。因此,每次更改数据库布局时,我都会花费大量时间来更新我的所有代码。

2 个答案:

答案 0 :(得分:0)

问题在于您如何编写类初始化程序。一个类应该负责设置自己的数据;没有必要编写将属性设置为保持值的初始化函数,然后依靠类外部的过程将其设置为实际值。所以:

class studentDef(object):
    def __init__(self, firstName, lastName, id, address1, address2, city, state, zip, status):
        self.firstName = firstName
        self.lastName  = lastName
        self.id        = id
        self.address1  = address1
        self.address2  = address2
        self.city      = city
        self.state     = state
        self.zip       = zip
        self.status    = status

现在,您可以使用*语法将列表扩展为单独的参数,即可通过该行:

cursor.execute(selectTxt)
for row in cursor:
   mystudent = studentDef(*row)

(请注意,在Python中,您应该从不range(len(something))进行迭代,始终对事物本身进行迭代。)

听起来processStudent应该是StudentDef类的方法。最后,请注意,Python风格是对类使用InitialCaps,对属性使用lower_case_with_underscore:StudentDef,first_name,last_name。

答案 1 :(得分:0)

您可以使用对象关系映射(ORM)工具。这样的工具会将您的SQLite3数据库映射到Python对象(反之亦然),从而减少了代码量。

以下是使用peewee的示例:

from peewee import *

db = SqliteDatabase('students.sqlite3')

class Student(Model):
    first_name = CharField()
    last_name = CharField()
    address1 = CharField()
    address2 = CharField()
    city = CharField()
    state = CharField()
    zip = CharField()
    status = SmallIntegerField()

    class Meta:
        database = db

然后您可以使用以下方法查询学生:

>>> query = Student.select()
>>> [student.first_name for student in query]
['Charlie', 'Huey', 'Peewee']
>>> query[1]
<__main__.Student at 0x7f83e80f5550>
>>> query[1].first_name
'Huey'

还有其他与SQLite兼容的Python ORM:SQLAlchemyDjango模型(用于构建Web应用程序),也许还有许多其他模型。