1

我认为 cur.mogrify() 不正确地将一些 's 注入到它生成的字符串中。我正在尝试编写一个很小的 ​​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 模型.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"")删除 's 解决了这个错误,但我认为这是一个烦人的工作。谁能确认这是一个错误还是我错过了什么?

4

2 回答 2

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
于 2018-08-05T15:57:18.223 回答
0

这不是一个错误。请参阅此 passus 之后的示例代码:

只有查询值应该通过这种方法绑定:它不应该用于将表名或字段名合并到查询中(Psycopg 将尝试将表名引用为字符串值,生成无效的 SQL)。如果您需要动态生成 SQL 查询(例如动态选择表名),您可以使用 psycopg2.sql 模块提供的工具。

于 2018-08-05T14:35:19.033 回答