我目前正在阅读关于SQLAlchemy的文档,以便在Flask中使用,而且我不清楚的一件事是我需要多少个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开发相对较新(我已经在其中完成了很多单线程脚本),所以也许我对范围和线程的理解有些缺乏?
答案 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,它将节省您的时间。