这是psycopg2 cur.mogrify()中的错误吗?

时间:2018-08-05 14:26:42

标签: postgresql psycopg2 python-3.7

我认为cur.mogrify()不正确地将一些插入到它生成的字符串中。我正在尝试编写一个供个人使用的小ORM,但我遇到了似乎是一个错误的行为:

class BaseModel():
  def __init__(self):
    self.id = None

  @classmethod
  def find(cls, id):
    sql = 'SELECT * FROM %s WHERE id = %s'
    print (cls.table_name)
    sql = cur.mogrify(sql, (cls.table_name, id))
    return sql

class TestModel(BaseModel):
  table_name = 'test_models'
  def __init__(self, attrs):
    self.test_field = attrs["test_field"]
    super().__init__()

python3 -i models.py

>>> TestModel.find(1)
test_models
b"SELECT * FROM 'test_models' WHERE id = 1"
>>> 

如您所见,TestModel.find(1)之后的第一行将按预期打印类的表,但是cur.mogrify在test_models周围放入'',这导致数据库抛出错误。我通过使用sql = sql.replace(b"'", b"")删除来解决了这个错误,但是我认为这是一个令人讨厌的工作。谁能确认这是错误还是我错过了什么?

2 个答案:

答案 0 :(得分:0)

这不是错误。请参见示例代码after this passus:

  

仅查询值应通过此方法进行绑定:不应将其用于将表名或字段名合并到查询中(Psycopg会尝试将表名引用为字符串值,从而生成无效的SQL)。如果需要动态生成SQL查询(例如动态选择表名),则可以使用psycopg2.sql模块提供的功能。

答案 1 :(得分:0)

您可以使用AsIs()来取消表名的引用:

from psycopg2.extensions import AsIs
...
table_name = 'test_models'
sql = 'SELECT * FROM %s WHERE id = %s'
sql = cur.mogrify(sql, (AsIs(table_name), 1))
print sql

返回:

SELECT * FROM test_models WHERE id = 1