有没有必要建立一个模型,只是为了获得一组值。使用查询来获取值要简单得多,效率更高。这不会给你一条线 - 但Python的主要优点之一是它的可读性,而不是简洁性。
下面的例子可以很容易地适应创建了一个查询字符串的通用功能和返回值的列表(或迭代器):
from PySide.QtSql import *
db = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName(':memory:')
db.open()
db.transaction()
db.exec_('CREATE TABLE colors (id INTEGER PRIMARY KEY, color TEXT NOT NULL)')
db.exec_("INSERT INTO colors VALUES(1, 'Red')")
db.exec_("INSERT INTO colors VALUES(2, 'Blue')")
db.exec_("INSERT INTO colors VALUES(3, 'Green')")
db.exec_("INSERT INTO colors VALUES(4, 'Yellow')")
db.commit()
def list_colors():
colors = []
query = QSqlQuery('SELECT color FROM colors')
while query.next():
colors.append(query.value(0))
return colors
print(list_colors())
# or use a generator function:
def generate_colors():
query = QSqlQuery('SELECT color FROM colors')
while query.next():
yield query.value(0)
print(list(generate_colors()))
编辑:
这里一个通用的fetchall
函数(类似于python的sqlite3 module中的cursor.fetchall)。我的这种实现它可以是一个查询字符串或主动QSqlQuery
对象,并返回要么值(一列)的列表或值的元组(多个列):
def fetchall(query):
if isinstance(query, str):
query = QSqlQuery(query)
result = []
count = query.record().count()
indexes = range(count)
while query.next():
if count == 1:
result.append(query.value(0))
else:
result.append(tuple(query.value(i) for i in indexes))
return result
# one liner ...
print(fetchall('SELECT color FROM colors'))
这也可以实现作为一个生成器,它将更适合于非常大的结果集。
EDIT2:
如果您使用的查询,然后,一旦行已选定的模型,您可以使用列表理解拉出列值:
model = QSqlTableModel()
model.setTable('colors')
model.select()
# one liner ...
print([model.index(i, 1).data() for i in range(model.rowCount())])
谢谢。只有绑定到GUI元素时才使用模型? – davideps
@davideps。不,但它不像查询那么轻,所以每次调用函数时创建一个似乎效率低下。如果我打算使用模型进行查询,我会继承'QSqlTableModel'并添加一些方法(比如添加到我的答案中的通用'fetchall')。 – ekhumoro
@davideps。我添加了一个使用模型进行查询的例子,以及列表理解来提取列值。有可能有很多方法来剥皮这个特殊的猫... – ekhumoro