我想知道是否有办法过滤使用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)
答案 0 :(得分:2)
SQL查询在数据库服务器中执行,因此如果您有支持Python的后端,则可以在Python中编写存储过程和函数。
PostgreSQL有PL/Py:
纯Python:首先,所有代码都是用纯Python编写的,这样py-postgresql就可以在任何可以安装Python 3的地方工作.C中的优化是在需要的地方进行的,但总是可选的。
准备好的声明:使用PG-API接口,可以多次创建和使用协议级预处理语句。 db.prepare(SQL)(*参数)
COPY支持:使用方便的COPY界面直接将数据从一个连接复制到另一个连接。不需要中间文件或技巧。
数组和复合类型:完全支持数组和复合。请求它们的查询将返回提供对其中元素的访问的对象。
快速控制台:获取一个与PostgreSQL连接的Python控制台,以便进行快速测试和简单的脚本。
您可能会发现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
[更新]
好的,我打算看一下。谢谢。但没有本土的? - user1585507
原生你的意思是“只使用核心库”?不,没有。如果你不能使用PL / Py,你最好的镜头是像SQLAlchemy这样的ORM(在SQL方面非常具有表现力),或者像Pony(在Python方面更具表现力)。两者都可以让您轻松地重用和复合查询。
如果您让用户构造复杂的查询条件,并尝试避免使用字符串插值和连接来编写SQL查询的麻烦,我建议使用SQLAlchemy核心。
如果您的查询很简单,并且您只想尽可能避免Python和SQL之间的阻抗不匹配,那么请使用Pony。
答案 1 :(得分: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
Quering:
>>> [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')]
您可以编写Python functions in PostgreSQL,但它应该是在您的服务器上创建的函数,并且它不是从表中过滤数据的非常有效的方法 - 不会使用索引。