2011-08-23 44 views
1

我经常选择SQLite数据库中的数据为使用类似字典的列表:表列在Python解决

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服务器等),我我更习惯使用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包 - 直到我确信他们将会使我的应用程序受益。

问候, 艾伦

回答

2

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

  1. row['class']是正确的语法,但row.class不是;关键字不能用直接作为属性名称。
  2. 而且,更一般地说,如果您制作的查询的列名不是有效的属性名称(包括上述情况),则字典式语法将允许您访问该列。 row.COUNT(*)显然不是有效的语法,但是row['COUNT(*)']是等。(是的,你可以在查询中使用AS别名,这很好,当然。不过,这是一个有效的关注。)

话虽如此,你的课程当然支持两种寻址列的方法。尽管如此,我仍然希望保持一致性,如果您有class列,如果以不同的方式解决问题,它会显得很奇怪:row.widget, row.dingus, row['class']。 (其中一件事不像其他...)

+0

感谢您的回答@cdhowie。你为字典关键字寻址提供了一个很好的例子。问候。 –