我试图将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有这个特定原因吗?是否可以创建可以排除双引号的自定义数据库适配器?
非常感谢任何帮助。
答案 0 :(得分:1)
我不熟悉SQLRelay。 Peewee引用表名(和其他实体)有几个原因:
如果不保留所有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