table 'XX' is already defined for this MetaData instance

本文介绍了解决在使用SQLAlchemyORM时遇到的“表已定义”错误的方法。提供了两种解决方案:一是清除元数据对象中的所有表定义,二是通过反射检查表是否存在,避免重复定义。
部署运行你感兴趣的模型镜像

table 'roles_users' is already defined for this MetaData instance,意思是说表XX已经定义。这个在于你想干嘛。

第一,如果你想删除旧类并重新生成新的映射类

那么在定义类之前尝试运行以下行:

db.metadata.clear()

原因是第一次通过定义python类声明SQLAlchemy Mapping时,类的定义将保存到元数据对象中,以防止多个定义映射到同一个表所导致的冲突。当您调用该clear()方法时,您将清除元数据对象在内存中保存的所有表定义,这允许您再次声明它们。

第二,保留你的旧类,然后重启你的应用程序

可以使用reflect方法编写测试以查看表是否已存在:

db.metadata.reflect(engine=engine)

其中engine是您使用创建的数据库连接create_engine(),并查看您的表是否已存在,并且只有在未定义表时才定义该类。

 

参考:https://stackoverflow.com/questions/37908767/table-roles-users-is-already-defined-for-this-metadata-instance

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

python sqlalchemy mysql,以下语句,根据已存在的表名,动态生成对应的Model。出现错误提示sqlalchemy.exc.InvalidRequestError: Table 't_s_sendlist' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object. def generate_sendlistmodel_from_table_name(table_name): model_attributes={ '__tablename__': table_name, 'id':db.Column(db.Integer, primary_key=True, autoincrement=True), # user:db.Column(db.String(20), nullable=False), #从 s_Task_list 获取 'phone':db.Column(db.String(11), nullable=False), # 号码 'phone_area':db.Column(db.String(50), nullable=True), # 区域 'phone_operator':db.Column(db.String(20), nullable=True), # 运营商 # sms_text:db.Column(db.String(1000), nullable=True) , #从 s_Task_list 获取 'sms_billing_this':db.Column(db.Integer, nullable=True) , # 计费条数/条 'sms_msgid':db.Column(db.String(20), nullable=True), # 用于判断 对应关系 # s_channel:db.Column(db.String(20), nullable=True) , #从 s_Task_list 获取 's_back_channel':db.Column(db.String(20), nullable=True, index=True) , # 后台通道 # s_bottom_account:db.Column(db.String(20), nullable=True) , #底层帐号,不需要在此,应在通道配置时用到 's_send_time_this':db.Column(db.DateTime, index=True) , # 发送时间 's_finished_time_this':db.Column(db.DateTime), # 完成时间 # s_finished_time_this':db.Column(db.DateTime(timezone=True)) , # 完成时间 's_state_time':db.Column(db.DateTime), # 状态获取时间,状态获取时的时间点 # s_submit_state':db.Column(db.String(20), nullable=True) , #提交状态,对任务 's_state_gateway':db.Column(db.String(20), nullable=True), # 网关状态 's_state':db.Column(db.String(20), nullable=True), # 最后状态 成功、失败、无 's_state_for_more':db.Column(db.String(20), nullable=True) , # 状态更多描述 'sms_text':db.Column(db.String(1000), nullable=True), # 从 s_Task_list 获取 's_submit_time_this':db.Column(db.DateTime, index=True), # 提交时间,提交时填上 'discontinue':db.Column(db.Integer) ,# 中止。 当用户已提交后,在任务清单界面,点击按键进行中止任务 'resend_backup':db.Column(db.Integer) , # 标识 None:原始状态; 1: 为 重发前备份的记录 2: 重发前备份的发送记录 3: 新增一条的记录,用于触发SRS.sms_send 'status_read':db.Column(db.Integer), # 状态已读 /未读, 1 为已读 # 屏蔽。需要时让动态计入。 cmpp_sendlists':db.relationship("cmpp_Send_list", backref='s_sendlist') # 不会在数据库出现 } model = type(table_name.capitalize(), (db.Model,), model_attributes) print("在 generate_sendlistmodel_from_table_name里面") print(model.__name__) print(model.__tablename__) return model tablelist = ['t_s_senst'] print("打印模型的表名") model_conditions_list=[] for tablename in tablelist: model_conditions=[] model = generate_sendlistmodel_from_table_name(tablename) print(model.__tablename__) print(model) model_conditions.append(model) conditions=[] model_conditions.append(conditions) model_conditions_list.append(model_conditions)
09-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值