SQLAlchemy ORM摆脱了全局元数据

时间:2017-05-09 18:29:49

标签: 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(self):
        return Table(self.name, self.metadata, Column('bone', String))

样本用法:

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

f()
f()

例外:

  

InvalidRequestError:表' Spot'已经为此MetaData定义了   实例。指定' extend_existing = True'重新定义选项和   现有Table对象上的列。

我无法连续两次调用函数f(),因为元数据是全局的。我不想" extend_existing",只需从程序中的其他位置调用独立函数。我没有看到如何使Base非全局,因为静态类声明依赖于它。有没有办法使用这种史诗比例的全局变量?

1 个答案:

答案 0 :(得分:0)

您似乎试图将表格与Dog类相关联,但实际上是在Table方法中创建 get_table()。这就是为什么它抱怨当前数据库中已存在 Table 的原因。