SQLAlchemy - 从表定义中删除列

Sle*_*dge 5 python sqlalchemy

假设我想动态设置主键。我使用虚拟键初始化表,因为 SQLAlchemy 似乎需要这样做。我编写了一个函数,用于根据主索引指定主键,该索引的行为在所有意图和目的上都类似于主键。当我尝试取消虚拟钥匙时,我的问题出现了。

我希望能够在表声明后删除我的虚拟密钥,以便我可以用我的自定义密钥替换它。然而,我不能仅仅delattr(my_table,'dummy_key')因为还会有其他对虚拟密钥的引用,例如在其他地方my_table.__table__.columns,甚至可能在其他地方。

我的问题是,有没有一种好方法可以从表中删除列定义,同时也删除所有这些其他引用?

目前我像这样定义表:

Base = declarative_base(cls=DeferredReflection)

class my_table(Base, TableExtension):
    __tablename__ = "my_table"
    __table_args__ = {'schema': 'my_schema'}
    dummy_key = Column(String(), primary_key=True) #false key, just a placeholder, sqlalchemy requires this
Run Code Online (Sandbox Code Playgroud)

TableExtension添加一个方法:

def set_primary_key(self, column_name, column_type):
    self[column_name] = Column(column_type, primary_key=True)
Run Code Online (Sandbox Code Playgroud)

需要帮助编写此函数:

def remove_column(table, col_name):
    # what should I do here?
Run Code Online (Sandbox Code Playgroud)

我已经有一个获取新密钥的函数并且它可以工作:

column_names, column_types = get_primary_index(table)
Run Code Online (Sandbox Code Playgroud)

我通过继承向表添加了一个方法来分配新键。

table.set_new_keys(column_names, column_types)
Run Code Online (Sandbox Code Playgroud)

然后以通常的方式反映表格:

Base.prepare(engine)
Run Code Online (Sandbox Code Playgroud)

这里最重要的?是如何删除列引用而不对表的其余属性进行太多操作。任何意见,将不胜感激。

jix*_*ang 2

深入研究 SQLAlchemy 的源代码后,可能没有官方方法来支持您的需求。

经过尝试,我发现了一种似乎有效的方法(稳定中没有保证)

只需从表类中获取元数据table_meta = my_table.metadata.tables[my_table.__tablename__]并修改 table_meta._cloumnstable_meta._cloumns.remove(table_meta._cloumns['dummy_key'])

这对我的查询有用select,希望有帮助。