当我尝试重新初始化我的数据库时,我不断收到IntegrityError:
sqlalchemy.exc.IntegrityError: (IntegrityError) (1217, 'Cannot delete or update a parent row: a foreign key constraint fails') '\nDROP TABLE users' ()
在我的init_db脚本中,我有:
def main(argv=sys.argv):
if len(argv) != 2:
usage(argv)
config_uri = argv[1]
setup_logging(config_uri)
settings = get_appsettings(config_uri)
engine = create_engine('...')
Session.configure(bind=engine)
session = Session()
Base.metadata.bind=engine
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
它会让我删除Users表,这是:
class User(Base):
__tablename__='users'
__table_args__={
'mysql_engine':'InnoDB',
'mysql_charset':'utf8',
}
user_id = Column(Integer, primary_key=True, unique=True)
username = Column(VARCHAR(16), primary_key=True, unique=True)
name = Column(VARCHAR(16))
password = Column(VARCHAR(20))
email = Column(VARCHAR(30))
creation = Column(DateTime, default = datetime.datetime.now)
def __init__(self, un, name, pw, email):
self.username = un
self.name = name
self.email = email
self.password = pw
解决方法:
我看到两个可能的原因:
>未映射表:数据库中有另一个表具有到users表的ForeignKey,但是没有映射到任何sqlalchemy模型,因此在drop_all操作期间不会被删除.
>缺少ForeignKey映射:sqlalchemy模型中缺少某些关系.例如,DB上的地址表有一个指向users表的ForeignKey,但是你的模型地址(或正确地说,地址的映射器)不配置这个ForeignKey,因此在drop_all期间sqlalchemy没办法知道应该在引用的表(用户)之前删除此表.
标签:python,mysql,sqlalchemy,pyramid
来源: https://codeday.me/bug/20190826/1728127.html