2

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

我是从 Django 背景来解决这个问题的,在这个背景下,将单独的应用程序组合到一个网站中是很常见的。每个应用程序都通过继承来声明自己的模型,django.db.models.Model您可以通过简单地导入其模型并在应用程序中使用它来创建与另一个模型的关系。

在不同的地方声明模型通常很有用。MetaData但是由于 SQLAlchemy 的显式或Base声明,这变得有点问题。我不确定处理这个问题的最佳方法是什么。我的问题是:独立声明 SQLAlchemy 模型以便以后组合使用它们的最佳方法是什么?

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

我宁愿有一个中心点拉入模型并配置它们,这样当一个项目想要使用例如我的应用程序的用户模型时,它会导入它并使其使用项目的 Base 或 MetaData 或任何需要的东西。这可能涉及使用“经典映射MetaData”(但是无论如何您都必须传递相同的内容)。

编辑:嗯,我刚刚看到了一个相关的问题(跨项目重用 SQLAlchemy 模型),它属于同一个领域。我不确定接受的答案是最好的解决方案(或者即使是一个)。

指定时使用显式列而不是字符串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)
  ...

唔...

4

0 回答 0