使用 PySide 将数据库列转换为 Python 列表?
Turn database column into Python list using PySide?
使用 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
函数(类似于 cursor.fetchall in the python's sqlite3 module)。我对此的实现采用查询字符串或活动 QSqlQuery
对象,以及 returns 值列表(对于一列)或值元组(对于多列):
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())])
对于 C++ 中的所有 Qt 方法,PySide 层几乎是 1 比 1。下面给出了一些 C++ 代码。
因为 Qt Sql 层是为后端数据库类型抽象的,并且面向事件循环上的 Gui 界面,它没有 R 或其他语言可能具有的相同的可用内衬。虽然你可以在几行中完成。
另外 Qt 对 SQL 的错误处理方法通常是通过查询最后一个错误或查看 exec
或 open
调用的 return。元组在 C++ 中不是原生的,因此 python 接口不会大量使用元组。
http://doc.qt.io/qt-4.8/sql-sqlstatements.html
http://doc.qt.io/qt-4.8/qsqltablemodel.html#details
QSqlTableModel model;
model.setTable("employee");
model.setFilter("salary > 50000");
model.setSort(2, Qt::DescendingOrder);
model.select();
for (int i = 0; i < model.rowCount(); ++i) {
QString name = model.record(i).value("name").toString();
int salary = model.record(i).value("salary").toInt();
qDebug() << name << salary;
}
指定查询的替代语法
QSqlQueryModel model;
model.setQuery("SELECT * FROM employee");
int salary = model.record(4).value("salary").toInt();
http://doc.qt.io/qt-4.8/qsqlresult.html#size
QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
QString country = query.value(0).toString();
doSomething(country);
}
Qt 的 Sql 界面的真正强大之处在于它可以很容易地制作一个 GUI 来以您能想到的几乎任何类型的配置来表示数据库,以及它是如何从数据库引擎中抽象出来的.
即使说了所有关于 Qt 如何处理它的 SQL 调用...它仍然与其他 Python 库在与数据库交互方面不相上下:
How to retrieve SQL result column value using column name in Python?
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
cursor.execute("SELECT name, category FROM animal")
result_set = cursor.fetchall()
for row in result_set:
print "%s, %s" % (row["name"], row["category"])
希望对您有所帮助。
使用 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
函数(类似于 cursor.fetchall in the python's sqlite3 module)。我对此的实现采用查询字符串或活动 QSqlQuery
对象,以及 returns 值列表(对于一列)或值元组(对于多列):
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())])
对于 C++ 中的所有 Qt 方法,PySide 层几乎是 1 比 1。下面给出了一些 C++ 代码。
因为 Qt Sql 层是为后端数据库类型抽象的,并且面向事件循环上的 Gui 界面,它没有 R 或其他语言可能具有的相同的可用内衬。虽然你可以在几行中完成。
另外 Qt 对 SQL 的错误处理方法通常是通过查询最后一个错误或查看 exec
或 open
调用的 return。元组在 C++ 中不是原生的,因此 python 接口不会大量使用元组。
http://doc.qt.io/qt-4.8/sql-sqlstatements.html
http://doc.qt.io/qt-4.8/qsqltablemodel.html#details
QSqlTableModel model;
model.setTable("employee");
model.setFilter("salary > 50000");
model.setSort(2, Qt::DescendingOrder);
model.select();
for (int i = 0; i < model.rowCount(); ++i) {
QString name = model.record(i).value("name").toString();
int salary = model.record(i).value("salary").toInt();
qDebug() << name << salary;
}
指定查询的替代语法
QSqlQueryModel model;
model.setQuery("SELECT * FROM employee");
int salary = model.record(4).value("salary").toInt();
http://doc.qt.io/qt-4.8/qsqlresult.html#size
QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
QString country = query.value(0).toString();
doSomething(country);
}
Qt 的 Sql 界面的真正强大之处在于它可以很容易地制作一个 GUI 来以您能想到的几乎任何类型的配置来表示数据库,以及它是如何从数据库引擎中抽象出来的.
即使说了所有关于 Qt 如何处理它的 SQL 调用...它仍然与其他 Python 库在与数据库交互方面不相上下:
How to retrieve SQL result column value using column name in Python?
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
cursor.execute("SELECT name, category FROM animal")
result_set = cursor.fetchall()
for row in result_set:
print "%s, %s" % (row["name"], row["category"])
希望对您有所帮助。