独立的SQLAlchemy模型

时间:2013-03-28 23:53:05

标签: python sql sqlalchemy

在SQLAlchemy中声明模型时,您将创建一个要从中继承的declarative_base类。我想在多个地方声明模型并在另一个应用程序中使用它们(有关系)时会发现这有点问题。

我正在从Django背景接近这一点,通常将单独的应用程序合并到一个网站中。每个应用程序通过继承django.db.models.Model来声明自己的模型,您可以通过简单地导入模型并在应用程序中使用它来创建与其他模型的关系。

在各个地方宣布模型通常很有用。但是由于SQLAlchemy明确的MetaDataBase声明,这会产生一些问题。我不确定处理这个问题的最佳方法是什么。我的问题是:什么是独立声明SQLAlchemy模型以便以后组合使用它们的最佳方法?

我想让每个models.py声明都有自己的declarative_base是一个坏主意(SQLAlchemy docs说所有声明性模型都应该从同一个基础继承)。模仿Django的行为就是集中声明declarative_base并简单地将其导入到任何地方。但是这种情况使得每个单独的应用程序都与这个中心点相关联(当你想要创建完全独立的应用程序并且你不是Django时,这是有问题的。)

我宁愿在模型中设置中心点并对其进行配置,以便在项目想要使用例如我的应用程序的用户模型,它将导入它并使其使用项目的Base或MetaData或任何需要。这可能涉及使用“classical mappings”(但是无论如何你必须传递相同的MetaData。)

编辑:好吧,我刚刚看到一个相关的问题(Reusing SQLAlchemy models across projects),这种问题会进入同一个领域。我不确定接受的答案是最好的解决方案(或者如果它甚至是一个)。

在指定ForeignKey

时使用显式列而不是字符串

这是一种似乎有效的尝试:

app1.models:

Base = declarative_base()

class User(Base):
  id = Column(Integer, primary_key=True)
  name = Column(Text)

app2.models:

from app1.models import User

Base = declarative_base()

class Address(Base):
  user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
  user = relationship(User, backref=backref('addresses'))
  street1 = Column(Text)
  ...

嗯...

0 个答案:

没有答案