python - 使用 PySide 将数据库列转换为 Python 列表?

标签 python qt pyside qsqltablemodel

使用 PySide/Qt 的 QSqlTableModel 是否有一种快速、优雅的方法将数据库列转换为 Python 列表?例如,在 R 中,这将是一小行代码。现在,我在 Python 中手动循环行,这对于高级语言来说似乎很麻烦:

def get_value_idx(value):
    model = QSqlTableModel()
    model.setTable("pvalues")
    model.setFilter("val = '%s'" % (value))
    model.select()
    count = model.rowCount()
    if count >= 1:
        l = list()
        for n in range(count):
            id = model.record(n).value('id')
            l.append(id)
        return l  # return id list
    if count == 0:
        return -1 # return id that shows error

最佳答案

不需要仅仅为了获取一组值而创建模型。使用查询来获取值要简单得多、效率更高。这不会给你一句简短的话 - 但 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 的 cursor.fetchall 中的 sqlite3 module )。我对此的实现采用查询字符串或事件的 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'))

这也可以作为生成器实现,这更适合非常大的结果集。

编辑2:

如果您使用模型进行查询,那么一旦选择了行,您就可以使用列表理解来提取列值:

model = QSqlTableModel()
model.setTable('colors')
model.select()

# one liner ...

print([model.index(i, 1).data() for i in range(model.rowCount())])

关于python - 使用 PySide 将数据库列转换为 Python 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46566517/

相关文章:

python - 如何在 Qt QGraphicsScene 中剪切未闭合的路径

python - 从嵌套列表创建字典

windows - 在 Windows 上下载 QT 静态构建

c++ - Qt QList C3892 : cannot assign to a variable that is const

c++ - QObject::connect:没有这样的信号运行时警告 - 找不到原因

python - 如何将可编辑的 QComboBox 链接到数据库

python - 运行 Luigi 工作流程时没有可视化依赖图

python - 使用 uvicorn 运行时,fastapi 找不到模型定义

python - 如何在excel外执行vba宏

python - Shiboken无法导入