Peewee 循环外键依赖异常
Peewee circular foreign key dependencies exception
我正在尝试使用循环依赖复制 Peewee 示例应用程序,如 the docs 中所述,尽管创建者明确表示这通常不是一个好主意。这是主要从文档中复制的代码:
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 注释的行中遇到异常。需要这一行,如文档中所述:
When you call create_table we will again encounter the same issue. For
this reason peewee will not automatically create a foreign key
constraint for any deferred foreign keys.
To create the tables and the foreign-key constraint, you can use the
SchemaManager.create_foreign_key() method to create the constraint
after creating the tables.
这是我使用 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() 的额外调用。
文档中有一个明确的说明:
Because SQLite has limited support for altering tables, foreign-key constraints cannot be added to a table after it has been created.
我正在尝试使用循环依赖复制 Peewee 示例应用程序,如 the docs 中所述,尽管创建者明确表示这通常不是一个好主意。这是主要从文档中复制的代码:
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 注释的行中遇到异常。需要这一行,如文档中所述:
When you call create_table we will again encounter the same issue. For this reason peewee will not automatically create a foreign key constraint for any deferred foreign keys.
To create the tables and the foreign-key constraint, you can use the SchemaManager.create_foreign_key() method to create the constraint after creating the tables.
这是我使用 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() 的额外调用。
文档中有一个明确的说明:
Because SQLite has limited support for altering tables, foreign-key constraints cannot be added to a table after it has been created.