【问题标题】:Looking for a way to rewrite Postgresql query before executing it寻找一种在执行 Postgresql 查询之前重写它的方法
【发布时间】:2011-09-21 07:46:17
【问题描述】:

我有一个 Postgres 客户端发送类似的查询

SELECT ... FROM "public"."mycontent" "mycontent"
WHERE (strpos(substring("mycontent"."summary" from 1), 'search_string') + 1 - 1 > 0)

到我们的 Postgres 服务器。我希望客户端使用我的全文搜索功能,但我无法访问客户端的代码。所以我正在寻找一种方法来将上述形式的所有传入查询重写为:

SELECT ... FROM "public"."mycontent" "mycontent"
WHERE id in full_text_search('search_string')

注意'search_string' 的提取,因此此处不能使用 Postgres 规则,因为它们不进行此类提取。我希望任何人都知道任何可以进行查询重写的 postgres 中间件或代理,或者还有其他更好的主意吗?谢谢。

【问题讨论】:

  • 理论上 RULE 是用来重写语句的,但我不认为他们可以通过查看 SQL 文本来确定是否应该重写。

标签: postgresql proxy middleware


【解决方案1】:

我想我必须回答我自己的问题。我使用 python gevent 套接字编程实现了一个用于重写查询的 postgres 代理服务器。请注意,如果连接使用 SSL,这将不起作用。

from gevent import socket, server, Greenlet, joinall

def pipe(source_socket, destination_socket, modify=False):
    while True:
        try:
            data = source_socket.recv(1024)
        except socket.error, e:
            break
        else:
            if data:
                if modify: data = data.replace("limit 10", "limit 1 ")
                destination_socket.send(data)
            else:
                break

def pg_proxy(client_socket, address):
    pg_socket = socket.create_connection(("localhost", 5432))
    pg_socket.settimeout(300.0)
    client_socket.settimeout(300.0)
    joinall((
        Greenlet.spawn(pipe, client_socket, pg_socket, modify=True),
        Greenlet.spawn(pipe, pg_socket, client_socket, modify=False)
    ))
    pg_socket.close()
    client_socket.close()

if __name__ == '__main__':
    s = server.StreamServer(("localhost", 5433), pg_proxy)
    s.serve_forever()

【讨论】:

    【解决方案2】:

    十年后……

    现在有一些东西可以为您做到这一点,它确实支持 SSL(而且它是免费的):Gallium Data。它是一个智能数据库代理,允许您更改任何数据库请求或响应您的心脏内容。它适用于 Postgres、MySQL、SQL Server 和 Mongo。

    披露:我是 Gallium Data 的创始人。

    【讨论】:

      【解决方案3】:

      我想知道你是否可以将 full_text_search 重写为在数据库服务器上执行的 SQL 函数(遵循 postgres sql 方言)。

      其实postgres提供了一套完整的函数来管理字符串http://www.postgresql.org/docs/9.0/static/functions-string.html

      【讨论】:

      • 这并不能解决客户端使用其他功能的问题。
      猜你喜欢
      • 2019-07-04
      • 2011-08-30
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多