在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个程序中执行此操作。因此,每次更改数据库布局时,我都会花费大量时间来更新我的所有代码。
答案 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:SQLAlchemy,Django模型(用于构建Web应用程序),也许还有许多其他模型。