簡體   English   中英

Peewee循環外鍵依賴項異常

[英]Peewee circular foreign key dependencies exception

我試圖按照文檔中的解釋使用循環依賴來復制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

Sqlite不支持ALTER TABLE ADD CONSTRAINT-因此,當您使用Sqlite時,應省略對create_foreign_key()的附加調用。

在文檔中有一個明確的注釋:

由於SQLite對更改表的支持有限,因此在創建表后不能將外鍵約束添加到表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM