2014-09-04 118 views
1

我目前正在阅读用于Flask的SQLAlchemy文档,而对我而言非常不清楚的是某些SQLAlchemy对象(例如BaseMetaData)需要多少个实例?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__中声明一个实例并重新使用它?

我发现自己一遍又一遍地问这个问题。我也试图找出是否有多个BaseMetaData对象是一个问题?我对Python的大规模开发比较陌生(我在这里做了很多单线程脚本),所以也许我对范围和线程的理解有点缺乏?

+1

对于大多数项目,您将只有一个声明基类。由于您使用的是Flask,因此可以考虑使用Flask-SQLAlchemy,它在Web应用程序上下文中使这些事情变得更容易。 – davidism 2014-09-04 14:23:13

回答

1

您只需要一个烧瓶项目中的Base实例。如果您使用的烧瓶SQLAlchemy的,那么你可以直接使用型号从SQLAlchemy的实例:

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
db = SQLAlchemy(app) 

class User(db.Model): 
    pass 

使用烧瓶SQLAlchemy中,你将有分页和一些有用的方法,如提供get_or_404,它会为以后节省您的时间。