【问题标题】:Psycopg2 production appropriate mogrify?Psycopg2 制作合适 mogrify?
【发布时间】:2023-03-21 15:45:01
【问题描述】:

我想完全按照cursor.mogrify 的方式做,但要以适合生产的方式。

我正在更新一些通过连接字符串来构建查询的旧版 Python 代码。我需要更改它以安全逃生。

查询很长并且构建在与运行不同的服务器上,因此出于代码清晰度和实际可行性的原因,使用cursor.execute 转义的正常过程没有吸引力。

我会使用 mogrify,但我知道它仅用于调试目的。

我环顾四周,似乎无法找到一个好的答案。你有什么建议?

【问题讨论】:

  • 为什么使用 cursor.execute 进行转义的正常过程在代码清晰度和实际可行性方面都没有吸引力?我不知道比这更好的了。
  • 数据库没有暴露在它作为子进程运行的服务器之外,因此无法从构建查询的位置直接联系它。这是实际的限制。明确的原因是维护者很难阅读通过长长的元组进行插值。
  • 您在哪里看到mogrify 不打算用于生产?不质疑那句话,只是好奇……
  • 2013 年我问这个问题时的 psycopg 文档 ;)。

标签: python sql postgresql psycopg2 python-db-api


【解决方案1】:

不要使用tuple。使用dictionary

d = {'p1': val1, 'p2': val2}
cur.execute("""
    select *
    from t
    where col1 = %(p1)s and col2 = %(p2)s
    """, d
)

如果有可选参数传递则为null

d = {'p1': None, 'p2': val2}
cur.execute("""
    select *
    from t
    where
        (%(p1)s is null or col1 = %(p1)s)
        and
        (%(p2)s is null or col2 = %(p2)s)
    """, d
)

建立到服务器的ssh 连接并通过它进行连接。

ssh -L 5432:localhost:5432 remotehost.com

【讨论】:

  • 接受,因为字典技术非常好。访问问题不是技术上的不可能问题,而是设计强加的限制。听起来 mogrify 可能是唯一的 mogrify,除了手动实现或滥用库之外,构建一个独立于运行它的转义字符串是不行的吗?
  • 我正在移动查询逻辑。这是一个比理想更大的变化,但是在运行查询之前必须构建查询的问题源于将数据库访问对外部世界私有化,然后将查询构建逻辑置于外部世界中所固有的抽象混合。
  • 使用mogrify没有大问题。对我来说,问题是字符串构建,我认为这是不好的做法。我认为您应该考虑在另一个问题中解释该设计限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多