为什么PeeWee引用表名?

时间:2018-05-03 14:46:27

标签: python-3.x peewee

我试图将PeeWee与SQL Relay集成,并且我遇到了PeeWee在表名周围用双引号创建SQL语句的问题。

这里有一些示例代码

from peewee import BooleanField
from peewee import CharField
from peewee import DateField
from peewee import ForeignKeyField
from peewee import Model
from SQLRelay import PySQLRDB
from sqlrelay_ext import SQLRelayDatabase

DB = SQLRelayDatabase('test2', host='<hostname>', user='<username>', password='<password>')

class Person(Model):
    name = CharField()
    birthday = DateField()
    is_relative = BooleanField()

    class Meta:
        database = DB

class Pet(Model):
    owner = ForeignKeyField(Person, backref='pets')
    name = CharField()
    animal_type = CharField()

    class Meta:
        database = DB

DB.connect()
Person.create_table(safe=False)
Pet.create_table(safe=False)

这是一个样本堆栈跟踪。

Query: CREATE TABLE "person" ("id" INTEGER NOT NULL PRIMARY KEY, "name" VARCHAR(255) NOT NULL, "birthday" DATE NOT NULL, "is_relative" SMALLINT NOT NULL)
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/peewee.py", line 2576, in execute_sql
    cursor.execute(sql, params or ())
  File "/usr/local/lib/python3.6/site-packages/SQLRelay/PySQLRDB.py", line 177, in execute
    raise DatabaseError('<pre>%s</pre>' % the_error)
SQLRelay.PySQLRDB.DatabaseError: <pre>Server message: Incorrect syntax near 'person'. severity(0) number(102) state(1) line(1)  Server Name:ubuntu-mssql  Procedure Name:</pre>

虽然我知道这是ANSI标准,但遗憾的是很多数据库客户端都没有很好地支持它。 PeeWee有这个特定原因吗?是否可以创建可以排除双引号的自定义数据库适配器?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我不熟悉SQLRelay。 Peewee引用表名(和其他实体)有几个原因:

  • 数据库peewee支持开箱即用,这得到了很好的支持。
  • 因此,您可以使用SQL保留字作为标识符或别名
  • 如果您的表/列包含空格(已经报告了相信与否......人们做了奇怪的事情)。

如果不保留所有SQL保留字的相当全面的列表,Peewee将不知道什么时候引用是严格要求而不是可选。这在一段时间的GH问题中进行了讨论。我选择不实现条件引用,因为我不想保留特殊情况加上大量保留字。

您可能会覆盖数据库类的execute_sql()方法,并使用正则表达式删除所有引号,然后再将它们发送到数据库驱动程序,但这感觉有点时髦。您还可以覆盖数据库get_sql_context()方法,以提供您自己的SQL生成上下文,该上下文可能还可以处理取消引用标识符。

编辑:看起来你正在使用sql server?您可以尝试转动“SET QUOTED_IDENTIFIER”:https://docs.microsoft.com/en-us/sql/t-sql/statements/set-quoted-identifier-transact-sql?view=sql-server-2017