engine = create_engine(SQLALCHEMY_DATABASE_URI, echo=True) # Connect to database # engine = create_engine(SQLALCHEMY_DATABASE_URI) # Connect to database SSMS_DB_Base.metadata.create_all(engine) # Create models
@contextmanager defsession_scope(): """Provide a transactional scope around a series of operations.""" s = sessionmaker(bind=engine)() s.expire_on_commit = False try: yield s s.commit() except: s.rollback() raise finally: s.close()
执行后发现,有些表可以映射,有些表无法映射,非常奇怪。
原因
最后猜测是 Python 的文件加载顺序导致的。在每个 model 和 db_tool.py 里加了一个 print 打印加载顺序,证实:在 db_tool.py 之前加载的 model 都能映射,在后面加载的就没法映射了。
create_all 执行时,只有已经 import 进内存、注册到 metadata 上的 model 才会被建表。
解决方案
在 ssms/utils/__init__.py 里全部 import 一遍所有的 model,保证加载 db_tool.py 之前,所有 model 都已就绪,即可全部映射。