导入关系中使用的 SQLAlchemy 模型?

Posted

技术标签:

【中文标题】导入关系中使用的 SQLAlchemy 模型?【英文标题】:Importing SQLAlchemy models used in relationship? 【发布时间】:2019-10-22 21:03:55 【问题描述】:

我是 SQLAlchemy 的新手(使用 Python 3),发现以下令人费解。在我的简单示例中,在单独的文件中定义了 2 个模型类,并通过关系链接它们。

    设置是否正确?我的代码要求Animal.py import Owner 因为定义了关系,否则app/main.py 将抛出关于Owner class not found 的错误。但是,official docs 和其他在线示例似乎没有导入与当前类有关系的其他类。

    model/__init__.py 对我的情况有用吗?如果是这样,它将用于什么?看到an example that used a __init__.py file。

Github 回购:https://github.com/nyxynyx/sqlalchemy-class-import-error

文件结构

app/main.py

import sys
sys.path.append('..')

from lib.db import db_session
from models.foo.Animal import Animal

if __name__ == '__main__':
    print(Animal.query.all())

models/foo/Animal.py

from sqlalchemy import *
from sqlalchemy.orm import relationship
from ..Base import Base
from .Owner import Owner    <-------------- !!!!! if not imported, error occurs when running main.py !!!!!

class Animal(Base):
    __tablename__ = 'animals'
    id = Column(Integer, primary_key=True)
    name = Column(Text)
    owner_id = Column(Integer, ForeignKey('owners.id'))

    owner = relationship('Owner')

models/Foo/Owner.py

from sqlalchemy import *
from ..Base import Base

class Owner(Base):
    __tablename__ = 'owners'
    id = Column(Integer, primary_key=True)
    name = Column(Text)

lib/db.py

import json
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy import create_engine

with open('../settings.json') as f:
    settings = json.load(f)
user, password, host, port, dbname = settings['db']['user'], settings['db']['password'], settings['db']['host'], settings['db']['port'], settings['db']['dbname']

connection_url =  f'postgresql://user:password@host:port/dbname'
engine = create_engine(connection_url)
Session = sessionmaker(autocommit=False, autoflush=False, bind=engine)
db_session = scoped_session(Session)

【问题讨论】:

@AndrewAllen 每个文件有 1 个模型类有什么好处吗? 【参考方案1】:

animal.py 很好。问题是,如果从不导入 owner.py,则 sqlalchemy 永远不会看到 Owner 模型/表,因此它永远不会将其注册到 Base 元数据中。您可以将 Owner 从 animal.py 导入 main.py 作为

import models.foo.Owner

在保留单独的模型文件的同时查看它的工作情况。

【讨论】:

以上是关于导入关系中使用的 SQLAlchemy 模型?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy

Flask-SQLAlchemy:用户角色模型和关系

努力想出 SQLAlchemy 模型关系

SQlAlchemy的增删改查

如何在 SQLAlchemy 中使用动态关系映射层次结构?

如何在sqlalchemy before_insert事件中添加模型的关系实例?