2

我想知道是否有一种方法可以使用用python编写的函数过滤请求给出的结果。像这样的东西:

SELECT id, name, path IF verifAccess(path)

在我的示例中,verifAcces 将是我编写的一个函数。如果路径可访问,则返回 True,否则返回 False。

谢谢。

这就是我需要过滤的请求:

def displayWaitingList(self):

    self.button_waiting.setEnabled(False)
    self.showing_waiting = True

    try:
        self.waiting_list
    except AttributeError:
        return

    self.query = QtSql.QSqlQuery()

    requete = "SELECT * FROM videos WHERE id IN ("

    for each_id in self.waiting_list:
        if self.waiting_list.index(each_id) != len(self.waiting_list) - 1:
            requete = requete + str(each_id) + ", "
        else:
            requete = requete + str(each_id) + ")"

    self.query.prepare(requete)
    self.query.exec_()

    self.modele.setQuery(self.query)

    self.proxy.setSourceModel(self.modele)
    self.tableau.setModel(self.proxy)
4

2 回答 2

2

SQL 查询在数据库服务器中执行,因此如果您有支持 Python 的后端,则可以使用 Python 编写存储过程和函数。

PostgreSQL 有PL/Py

纯 Python:首先,所有代码都是用纯 Python 编写的,因此 py-postgresql 可以在可以安装 Python 3 的任何地方工作。C 中的优化是在需要的地方进行的,但始终是可选的。

Prepared Statements:使用PG-API接口,协议级别的prepared statements可以被创建和使用多次。db.prepare(sql)(*args)

COPY 支持:使用方便的 COPY 界面直接将数据从一个连接复制到另一个连接。不需要中间文件或技巧。

数组和复合类型:完全支持数组和复合。请求它们的查询将返回提供对其中元素的访问的对象。

快速控制台:获取一个连接到 PostgreSQL 的 Python 控制台,用于快速测试和简单的脚本。

来源: http: //python.projects.pgfoundry.org/

您可能会发现Pony ORM非常有趣。它允许使用普通 python 而不是 SQL 查询数据库:

select(c for c in Customer if sum(c.orders.price) > 1000)

上述语句生成以下查询:

SELECT "c"."id"
FROM "Customer" "c"
  LEFT JOIN "Order" "order-1"
    ON "c"."id" = "order-1"."customer"
GROUP BY "c"."id"
HAVING coalesce(SUM("order-1"."total_price"), 0) > 1000

[更新]

好的,我要去看看它。谢谢。但没有原生的?– 用户 1585507

本地您的意思是“仅使用核心库”?不,没有。如果你不能使用 PL/Py,你最好的选择是像 SQLAlchemy 这样的 ORM(在 SQL 方面非常有表现力),或者像 Pony 这样的 ORM(在 Python 方面更有表现力)。两者都可以让您轻松地重用和组合查询。

如果您让用户构建复杂的查询条件,并试图避免使用字符串插值和连接来编写 SQL 查询的痛苦,我推荐SQLAlchemy核心。

如果您的查询很简单,并且您只想尽可能避免 Python 和 SQL 之间的阻抗不匹配,那么请使用 Pony。

于 2013-09-01T10:01:53.383 回答
0

您可以在客户端对其进行过滤:

创建表并填充数据:

import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('create table test(id int, name text)')
conn.execute("insert into test(id, name) select 1, 'test'")
conn.execute("insert into test(id, name) select 2, 'test2'")

def verifAccess(id):
    return id == 1

查询:

>>> [x for x in conn.execute('select id, name from test')]
[(1, u'test'), (2, u'test2')]
>>> [x for x in conn.execute('select id, name from test') if verifAccess(x[0])]
[(1, u'test')]

您可以在 PostgreSQL 中编写Python 函数,但它应该是在您的服务器上创建的函数,并且从表中过滤数据不是非常有效的方法 - 不会使用索引。

于 2013-09-01T10:02:17.753 回答