Python SQLAlchemy ORM摆脱全局元数据

Python SQLAlchemy ORM摆脱全局元数据,python,orm,sqlalchemy,Python,Orm,Sqlalchemy,示例程序: from sqlalchemy import Column, String, Table, select from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Dog(Base): __tablename__ = "kennel" name = Column(String, primary_key=True) def get_table

示例程序:

from sqlalchemy import Column, String, Table, select
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class Dog(Base):
    __tablename__ = "kennel"
    name = Column(String, primary_key=True)

    def get_table(self):
        return Table(self.name, self.metadata, Column('bone', String))
示例用法:

def f():
    spot = Dog("Spot")
    spot_stash = spot.get_table()

f()
f()
例外情况:

InvalidRequestError:已为此元数据定义了表“Spot” 例如。指定“extend_existing=True”以重新定义选项和 现有表对象上的列


我不能连续调用函数
f()
,因为元数据是全局的。我不想“扩展现有的”,只是从程序中的不同位置调用一个独立函数。我不知道如何使
Base
成为非全局的,因为静态类声明依赖于它。有没有办法使用如此大比例的全局变量?

您似乎试图获取与
Dog
类关联的表,但实际上正在
get_table()
方法中创建一个新的
表。这就是为什么它抱怨当前数据库中已经存在一个表。

函数的作用是什么?你能解释一下吗。有什么使用案例吗?@Laurent LAPORTE…因此,对于养狗场中的每只狗,我想取下每只狗的桌子,在那里放骨头,并添加一个t形骨头。稍后在程序中,我想重新创建狗并再次获取它们各自的表以进行另一个操作。对不起,我迷路了。“获取每只狗的表”是什么意思?你说的是记录吗?@Laurent LAPORTE每只狗都是一个复杂的产品,有许多与之相关的表,更像是整个数据库。它们跨越数百万行数据,对于我们公司的每只狗,它们的列集都略有不同。它已经创建并存在于数据库中,我只需要访问它。我可以从数据库中“反映”它,但这会很慢,特别是考虑到程序已经可以访问表定义。@Muposat您将在SQL中创建表误认为创建了
对象。创建
对象的行为会将该表添加到指定的
元数据
,从而导致此冲突。@univerio我知道这一点。jknupp声称“它在抱怨当前数据库中已经存在一个表”,这是不正确的。