我目前正在阅读有关在 Flask 中使用 SQLAlchemy 的文档,我不清楚的一件事是某些 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):
...
...
那么现在,我需要每个 ORM 类的 Base
实例吗?或者我可以在某处声明 Base
的单个实例(例如在 __init__.py
中)并重新使用它吗?如果我可以声明一个实例并重复使用它,那么从初始化的角度来看它是线程安全的还是我需要确保部分或全部与 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 项目中您只需要一个 Base 实例。如果您使用flask-sqlalchemy,那么您可以直接使用SQLAlchemy实例中的模型:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
class User(db.Model):
pass
使用 Flask-SQLAlchemy,您将可以使用分页和一些有用的方法,例如 get_or_404,这将节省您以后的时间。
关于python - SQLAlchemy 中需要多少个 Base 或 MetaData 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666318/