python - SQLAlchemy:如何多次创建动态列
问题描述
由于 python 类反射,我成功地创建了一个动态定义列的 sql 表。但是我不能多次运行代码。例如,下面的import_file应该创建一个静态表和一个具有特定列的动态表。如果我运行一次它就可以工作。但是第二次崩溃并返回以下错误:
Table 'dynamic' is already defined for this MetaData instance
代码示例:
from sqlalchemy import Column, Integer, String, Float, Boolean, Table
from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.orm import clear_mappers
import os
def import_file(filename, columns):
path = filename
if os.path.exists(path):
os.remove(path)
engine = create_engine(f"sqlite:///{path}", echo=True)
clear_mappers()
Base = declarative_base()
class StaticTable(Base):
__tablename__ = "static"
id = Column(Integer, primary_key=True)
name = Column(String)
class DynamicTable(Base):
__tablename__ = "dynamic"
id = Column(Integer, primary_key=True)
for c in columns:
setattr(DynamicTable,c,Column(String))
Base.metadata.create_all(engine)
import_file("test.db", columns = ["age","test"]) # WORKS
import_file("test2.db", columns= ["id","age","foo","bar"]) # NOT WORKING
我尝试使用sqlalchemy.orm.clear_mappers,但没有成功。知道如何解决吗?
解决方案
我认为你的代码并不完整,因为Base.metadata上的冲突
orm 类和表上的链接映射器,您已经定义了表。
你可以试试这样的想法
import_file("test.db", columns = ["age","test"])
Base.metadata.clear()
sqlalchemy.orm.clear_mappers()
import_file("test2.db", columns= ["id","age","foo","bar"])
推荐阅读
- go - 有没有办法使用 Go 的 `flag` 包捕获所有无法识别的命令行标志?
- c# - DispatcherTimer 在新线程中
- javascript - 是否可以使用`function`编写代码,而不是在ReactJS中使用`class`?
- c++ - 是否可以模拟进程的访问令牌?
- unix - grep 没有 macth 输出的字节点
- angular - 如何测试在Angular中更改类变量的void方法
- python - 如何使用 AWS CDK 获取伪参数用户数据?
- php - 无法使用 Salesforce php 客户端创建联系人对象,但能够创建其他人
- php - 根据 2x2 数组中的列插入排序
- jpa - 无法在此 ManagedType 上找到具有给定名称 [XXX] 的属性