我经常使用以下内容从SQLite数据库中选择数据到字典列表中:
conn.row_factory = sqlite3.Row
c = conn.cursor()
selection = c.execute('select * from myTable')
dataset = selection.fetchall()
dataset1 = [dict(row) for row in dataset]
但是,考虑到我的数据库背景(Foxpro,SQL-server等),我更习惯使用table.column格式,我可以使用它:
dataset2 = [RowObj(row) for row in dataset]
其中
class RowObj(dict):
def __getattr__(self, name):
return self[name]
问题 - 列值寻址,表['列']或table.column更可取?在我看来,后者看起来更整洁。这仅仅是个人偏好的问题,还是每种方法都有优点和缺点?
我还需要记住,有一天数据库可能会从SQLite更改为某些行mySQL,所以如果/当发生这种情况时我想要最少的代码更改。
我不想在这个阶段使用像SQLObject或SQLAlchemy这样的ORM包 - 直到我确信它们会使我的应用程序受益。
此致 艾伦
答案 0 :(得分:2)
我和row['column']
语法争了一段时间,但最后我更喜欢它。它有两个明显的优点:
row['class']
语法正确,但row.class
不是;关键字不能直接用作属性名称。row.COUNT(*)
显然不是有效的语法,但row['COUNT(*)']
是等等(是的,您可以在查询中使用AS
来设置别名,当然这很好。但是,这是一个有效的问题。)话虽如此,您的RowObj
课程当然支持对列进行寻址的方法。我仍然更喜欢一致性,如果你有一个class
列,如果你用不同的方式解决它会变得很奇怪:row.widget, row.dingus, row['class']
。 (这些事情中的一个与其他事情不同......)