SQLAlchemy: как создавать динамические столбцы несколько раз - PullRequest
0 голосов
/ 17 декабря 2018

Мне удалось создать таблицу SQL с динамически определенными столбцами, благодаря отражению класса Python.Но я не могу запустить код более одного раза.Например, следующий 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 , ноunsucessfully.Любая идея, как я могу решить это?

...