Python中的表列寻址

时间:2011-08-23 04:06:53

标签: python database sqlite

我经常使用以下内容从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包 - 直到我确信它们会使我的应用程序受益。

此致 艾伦

1 个答案:

答案 0 :(得分:2)

我和row['column']语法争了一段时间,但最后我更喜欢它。它有两个明显的优点:

  1. row['class']语法正确,但row.class不是;关键字不能直接用作属性名称。
  2. 而且,更一般地说,如果您创建的列查询的列名称不是有效的属性名称(包含上述案例),则字典样式语法将允许您处理该列。 row.COUNT(*)显然不是有效的语法,但row['COUNT(*)']是等等(是的,您可以在查询中使用AS来设置别名,当然这很好。但是,这是一个有效的问题。)
  3. 话虽如此,您的RowObj课程当然支持对列进行寻址的方法。我仍然更喜欢一致性,如果你有一个class列,如果你用不同的方式解决它会变得很奇怪:row.widget, row.dingus, row['class']。 (这些事情中的一个与其他事情不同......)