Python 中使用 SQLAlchemy 或者 Ponyorm 时可能会遇到一个问题,它们的教程中,所有的模型全都定义在同一个文件中,但是在实际使用中,我习惯于将每个类放在单独的文件中,但是由于都要引用同一个变量,导致一开始无法进行下去,总是提示我某某文件未初始化之类的。

一开始以为这是 SQLAlchemy 的问题,用着很糟心,就换到了 Ponyorm,但是也有同样的问题。到 Stack Overflow 搜索之后才知道,要想使用同一个变量,必须要合理引用。

假设我们的模型是这样的路径:

1
2
3
4
/model
  - Student.py
  - Teacher.py
  - Lesson.py

那么为了共享同一个变量,需要添加一个文件,暂且命名为 Base.py,这里要初始化这个变量,比如说对于 SQLAlchemy,它是一个 declarative_base,就要这样写:

1
2
3
4
# /model/Base.py
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

在其他文件中引用这个 Base 变量,例如 Student 中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# /model/Student.py

from sqlalchemy import String, Integer, Boolean, Column, Enum
from sqlalchemy.orm import relationship

from .Base import Base

class Student(Base):
    __tablename__ = "students"
    
    id = Column(Integer, primary_key=True)
    name = Column(String(15))

其他模型文件中也是一样,都要使用 from .Base import Base。最后,需要为 model 包添加 __init__.py

1
2
3
4
5
6
7
# /model/__init.py__
from .Base import Base
from .Teacher import Teacher
from .Student import Student
# ......

__all__ = ['Teacher', 'Student']