python - 如何将 SQLAlchemy 声明性模型拆分为模块?

标签 python sqlalchemy

我需要定义多个包含 SQLAlchemy 声明类的模块。我在每个名为 subclass_base() 的模块中编写了一个函数,在实例化后将 declarative_base() 的 Base 实例传递到该函数中。第一个模块的 subclass_base() 调用正确地对 Base 实例进行子类化,并且子类从函数外部可见。第二个模块的调用没有错误地完成,但在函数内部和外部,所有子类仅在某些时候反射(reflect)在 Base.__subclasses__ 中。这是一个最小的工作示例,每个模块中只有 1 个类定义:

模型.py

from sqlalchemy import Column, Integer, String
def subclass_base(Base):
    class Roles(Base):
        __tablename__ = 'roles'

        id = Column(Integer, primary_key=True)
        name = Column(String(32))

模型b.py

from sqlalchemy import Column, Integer, String
def subclass_base(Base):
    class Locations(Base):
         __tablename__ = 'locations'

        id = Column(Integer, primary_key=True)
        name = Column(String(64))

测试.py

from sqlalchemy.ext.declarative import declarative_base
from modela import subclass_base as amod
from modelb import subclass_base as bmod

def test():
    count = 0
    while True:
        try:
            Base = declarative_base()

            amod(Base)

            bmod(Base)
            sc = [subclass.__name__ for subclass in Base.__subclasses__()]
            assert(len(sc) == 2)

            print('.', end='')
            count += 1
        except AssertionError:
            print("Failed after {} successful pass(es)".format(count))
            count = 0

我怀疑这个问题是我忽略了与 declarative_base() 一起进行的元类工作的一个特定问题,但我似乎无法弄清楚发生了什么。我也想知道这是否是一个继承问题。我是否应该采用不同的架构方法而不是使用函数来子类化单个基类?

最佳答案

不要在函数中定义类。只需在单个定义模块中定义 Base,然后从其他模块导入该模块:

数据库文件

from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
Session = sessionmaker()

def bind_engine(engine):
    Base.metadata.bind = engine
    Session.configure(bind=engine)

模型.py

from sqlalchemy import Column, Integer, String
from db import Base

class Roles(Base):
    __tablename__ = 'roles'

    id = Column(Integer, primary_key=True)
    name = Column(String(32))

模型b.py

from sqlalchemy import Column, Integer, String
from db import Base

class Locations(Base):
    __tablename__ = 'locations'

    id = Column(Integer, primary_key=True)
    name = Column(String(64))

用户脚本.py

 from sqlalchemy import create_engine
 engine = create_engine('postgresql://user:pwd@server/database')
 from yourproject.db import bind_engine
 bind_engine(engine)

关于python - 如何将 SQLAlchemy 声明性模型拆分为模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51106264/

相关文章:

python - 使用 Python、Flask 和 SQLAlchemy 如何在 HTML 页面上打印数据库查询的结果?

mysql - 使用 SqlAlchemy + python 在日期时间字段上按时间过滤

python - SQLAlchemy 中的数据库列表

python - 为什么 re.VERBOSE 会阻止我的正则表达式模式工作?

python - Python非正式入门斐波那契数列 "b (None,)"的结果

python - 如何在 Python 中使用 imagemagick?

python - 组合关系

python - 使用Python提取医疗信息

python - Django Sphinx 自动模块——基础知识

sqlite - 如何在 Ubuntu 上更新 PyCharm 中的 SQLITE3 版本?