我目前正在阅读用于Flask的SQLAlchemy文档,而对我而言非常不清楚的是某些SQLAlchemy对象(例如Base
或MetaData
)需要多少个实例?SQLAlchemy中需要多少个Base或MetaData实例?
例如,这里的ORM文档(http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html)显示了这个例子:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class User(Base):
...
...
所以,现在,我需要的Base
每ORM类的实例?或者我可以在某处(例如在__init__.py
)声明一个Base
的单个实例并重新使用它?如果我可以声明一个实例并重新使用它,从初始化的角度来看它是线程安全的还是我需要确保在启动时会发生一些或所有与ORM相关的初始化操作?
同样,类似的情况MetaData
:
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
metadata = MetaData()
users = Table('users', metadata,
Column('id', Integer, primary_key=True)
Column('name', String),
Column('fullname', String))
现在,如果我要宣布一个地址Table
略低于用户(如在文档的例子),我可以看到如何可能会被罚款因为执行会按顺序发生。但是如果我把地址放在另一个模块中呢?那么我是否需要为该模块创建一个新的MetaData
实例,或者我可以再次在__init.py__
中声明一个实例并重新使用它?
我发现自己一遍又一遍地问这个问题。我也试图找出是否有多个Base
或MetaData
对象是一个问题?我对Python的大规模开发比较陌生(我在这里做了很多单线程脚本),所以也许我对范围和线程的理解有点缺乏?
对于大多数项目,您将只有一个声明基类。由于您使用的是Flask,因此可以考虑使用Flask-SQLAlchemy,它在Web应用程序上下文中使这些事情变得更容易。 – davidism 2014-09-04 14:23:13