2012-07-04 38 views
3

當我嘗試重新初始化我的數據庫,我不斷收到IntegrityError:的SQLAlchemy + MYSQL:無法刪除表由於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) 

它會讓我放棄用戶表,這是:

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 

回答

4

我看到兩個可能的原因:

  1. 未映射表:你必須在具有ForeignKeyusers表的數據庫的另一個表,但不映射到任何sqlalchemy模型,因此drop_all操作過程中不掉線。
  2. 缺少ForeignKey映射:在sqlalchemy模型中缺少某些關係。例如,DB上的addresses表有一個ForeignKey,它指向users表,但是您的模型Address(或正確地說,映射器爲Address)沒有配置此外鍵,因此在drop_allsqlalchemy期間沒有辦法知道該表應該在參考表之前丟棄(users)。