Почему PeeWee цитирует имена таблиц? - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь интегрировать 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)

Вот пример трассировки стека.

<code>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
'% the_error) SQLRelay.PySQLRDB.DatabaseError:
Server message: Incorrect syntax near 'person'. severity(0) number(102) state(1) line(1)  Server Name:ubuntu-mssql  Procedure Name:

Хотя я знаю, что это стандарт ANSI, к сожалению, он не очень хорошо поддерживается многими клиентами баз данных. Есть ли конкретная причина, по которой PeeWee это делает? Можно ли создать собственный адаптер базы данных, который бы исключал двойные кавычки?

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 03 мая 2018

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

...