请求中的条件

时间:2013-09-01 09:49:32

标签: python sql sqlite pyqt

我想知道是否有办法过滤使用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)

2 个答案:

答案 0 :(得分:2)

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

PostgreSQL有PL/Py

  

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

     

准备好的声明:使用PG-API接口,可以多次创建和使用协议级预处理语句。 db.prepare(SQL)(*参数)

     

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

[更新]

  

好的,我打算看一下。谢谢。但没有本土的? - 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,但它应该是在您的服务器上创建的函数,并且它不是从表中过滤数据的非常有效的方法 - 不会使用索引。