SQLAlchemy中需要多少个Base或MetaData实例?

时间:2014-09-04 13:05:26

标签: python flask sqlalchemy

我目前正在阅读关于SQLAlchemy的文档,以便在Flask中使用,而且我不清楚的一件事是我需要多少个SQLAlchemy对象的实例(例如BaseMetaData) ?

例如,此处的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__中声明一个实例并重新使用它吗?

我发现自己一遍又一遍地问这个问题。我还想弄清楚是否有多个BaseMetaData个对象?

我对大规模Python开发相对较新(我已经在其中完成了很多单线程脚本),所以也许我对范围和线程的理解有些缺乏?

1 个答案:

答案 0 :(得分:1)

你只需要一个烧瓶项目中的一个Base实例。如果您使用flask-sqlalchemy,那么您可以直接使用SQLAlchemy实例中的 Model

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,它将节省您的时间。