Исключение циклических внешних ключей Peewee - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь воспроизвести пример приложения Peewee, используя циклические зависимости, как описано в документах , несмотря на то, что создатель ясно заявляет, что это обычно плохая идея.Этот код в основном скопирован из документов:

from peewee import *

db = SqliteDatabase(None)

class BaseModel(Model):

class Meta:
    database = db

class User(BaseModel):
    username = CharField()
    # Tweet has not been defined yet so use the deferred reference.
    favorite_tweet = DeferredForeignKey('Tweet', null=True)

class Tweet(BaseModel):
    message = TextField()
    user = ForeignKeyField(User, backref='tweets')


db.init('twitter.db')
db.create_tables([User, Tweet])
User._schema.create_foreign_key(User.favorite_tweet) #Error
db.close()

Я получаю исключение в строке с комментарием #Error.Эта строка необходима, как описано в документации:

Когда вы вызываете create_table, мы снова сталкиваемся с той же проблемой.По этой причине peewee не будет автоматически создавать ограничение внешнего ключа для любых отложенных внешних ключей.

Чтобы создать таблицы и ограничение внешнего ключа, вы можете использовать метод SchemaManager.create_foreign_key () для создания ограничения послесоздание таблиц.

Это исключение, которое я получаю при использовании Python 3.5.2:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 2653, in execute_sql
    cursor.execute(sql, params or ())
sqlite3.OperationalError: near "CONSTRAINT": syntax error

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test3.py", line 23, in <module>
    User._schema.create_foreign_key(User.favorite_tweet)
  File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 4930, in create_foreign_key
    self.database.execute(self._create_foreign_key(field))
  File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 2666, in execute
    return self.execute_sql(sql, params, commit=commit)
  File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 2660, in execute_sql
    self.commit()
  File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 2451, in __exit__    reraise(new_type, new_type(*exc_args), traceback)
  File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 178, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.5/dist-packages/peewee.py", line 2653, in execute_sql
    cursor.execute(sql, params or ())
peewee.OperationalError: near "CONSTRAINT": syntax error

1 Ответ

0 голосов
/ 28 сентября 2018

Sqlite не поддерживает ALTER TABLE ADD CONSTRAINT - поэтому, когда вы используете Sqlite, вы должны пропустить дополнительный вызов create_foreign_key ().

В документах есть четкое ПРИМЕЧАНИЕ:

Поскольку SQLite имеет ограниченную поддержку для изменения таблиц, ограничения внешнего ключа не могут быть добавлены в таблицу после ее создания.

...