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

Python 将sqlite3行读入对象的更简单方法?,python,sqlite,Python,Sqlite,在Python中,我将sqlite3中的行读取到一个简单数据结构的对象中。在赋值时,我必须将行赋值给一系列变量。有没有更简单的方法 下面我提供了一些示例代码,希望能说明我的问题 import sqlite3 class studentDef(object): def __init__(self): self.firstName = 'x' self.lastName = 'x' self.id = 'x'

在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个其他项目中这样做。因此,每次更改数据库布局时,我都会花费大量时间更新所有代码。

问题在于如何编写类初始值设定项。类应该负责设置自己的数据;编写一个init函数将属性设置为持有值,然后依靠类外的进程将其设置为实际值,这是没有意义的。因此:

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中,您几乎不应该迭代
范围(len(something))
,而应该始终迭代对象本身。)


听起来好像
processStudent
应该是studentDef类的一个方法。最后,请注意Python风格是对类使用InitialCaps,对属性使用小写加下划线:StudentDef、first\u name、last\u name。

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

下面是一个示例,使用:

然后,您可以使用以下方式查询您的学生:

>>> query = Student.select()
>>> [student.first_name for student in query]
['Charlie', 'Huey', 'Peewee']
>>> query[1]
<__main__.Student at 0x7f83e80f5550>
>>> query[1].first_name
'Huey'
>query=Student.select()
>>>[student.first\u查询中学生的姓名]
['Charlie'、'Huey'、'Peewee']
>>>查询[1]
>>>查询[1]。名称
“休伊”

还有其他兼容SQLite:、模型(用于构建web应用程序)和许多其他的Python ORM。

这绝对是完美的!非常感谢!我想我的FORTRAN77正在展示!我从来没有想过每次都要重新实例化这个对象。谢谢你的其他建议,以及!
>>> query = Student.select()
>>> [student.first_name for student in query]
['Charlie', 'Huey', 'Peewee']
>>> query[1]
<__main__.Student at 0x7f83e80f5550>
>>> query[1].first_name
'Huey'