假设我想动态设置主键。我使用虚拟键初始化表,因为 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)
这里最重要的?是如何删除列引用而不对表的其余属性进行太多操作。任何意见,将不胜感激。
深入研究 SQLAlchemy 的源代码后,可能没有官方方法来支持您的需求。
经过尝试,我发现了一种似乎有效的方法(稳定中没有保证)
只需从表类中获取元数据table_meta = my_table.metadata.tables[my_table.__tablename__]并修改 table_meta._cloumnstable_meta._cloumns.remove(table_meta._cloumns['dummy_key'])
这对我的查询有用select,希望有帮助。
| 归档时间: |
|
| 查看次数: |
10156 次 |
| 最近记录: |