我在哪里放置以及如何使用SQLAlchemy Core和flask在项目中使用Table()调用?
问题描述:
所以我想在应用程序中使用SQLAlchemy Core和flask。我已经阅读了文档和许多教程,了解如何构建您的应用程序。所有的SQLAlchemy Core教程都将数据库描述直接放到应用程序的app.py文件中。我希望把这个数据库描述到它自己的Python模块(称为表/这里)和USW在我的视图,表单等,所以我想实现像下面这样的基本布局:我在哪里放置以及如何使用SQLAlchemy Core和flask在项目中使用Table()调用?
myapp/
run.py
tables/
__init__.py
tables1.py
tables2.py
...
views/
views1.py
...
...
什么我挣扎尤其是以下几点:
- 我应该把
metadata = MetaData()
到tables/__init__.py
并在tables/__init__.py
文件导入呢? - 如果我想访问我的表,我应该从
tables/tablesX.py
文件简单地导入实例吗? - 对我来说最完美的解决方案是将所有表放入元数据对象中。如果我然后需要访问例如我可以简单地将表格从
table = meta.tables[table_name]
中抽出来。但我不知道如何传递元数据对象,以保存所有的表。 - 还是我在这里完全地在错误的道路上我应该创建表的说明(即称之为
table = Table(name, tmp_metadata,...)
直接在我的views.py文件?
谢谢您的时间和最良好的祝愿,
。AH
答
让我们做它一步步时间最少的应用程序:
from sqlalchemy import ...
from flask import ...
from flask.ext.sqlalchemy import ...
app = Flask()
db = SQLAlchemy()
class Foo(db.Model):
...
@app.route(...)
def foo():
Foo.query.filter(...)
return ...
让我们进入该数据库塞入˚F到一个单独的模块:
# db.py
from sqlalchemy import ...
from flask.ext.sqlalchemy import ...
from .app import app
db = SQLAlchemy(app)
class Foo(db.Model):
...
# app.py
from flask import ...
from .db import Foo
app = Flask()
@app.route(...)
def foo():
Foo.query.filter(...)
return ...
别急,我们有一个循环依赖,所以我们要搬到app
出来:
# app.py
from flask import *
app = Flask()
# db.py
from sqlalchemy import ...
from flask.ext.sqlalchemy import ...
from .app import app
db = SQLAlchemy(app)
class Foo(db.Model):
...
# views.py
from flask import ...
from .db import Foo
from .app import app
@app.route(...)
def foo():
Foo.query.filter(...)
return ...
接下来,我们可以分割db.py
:
# app.py same
# views.py same
# db/__init__.py
from flask.ext.sqlalchemy import ...
from ..app import app
from .foo import Foo
db = SQLAlchemy(app)
# db/foo.py
from sqlalchemy import ...
from . import db
class Foo(db.Model):
...
但是等一下,我们再次有一个循环依赖,所以我们必须移动db
:
# app.py same
# views.py same
# db/__init__.py
from .common import db
from .foo import Foo
# db/common.py
from flask.ext.sqlalchemy import ...
from ..app import app
db = SQLAlchemy(app)
# db/foo.py
from sqlalchemy import ...
from .common import db
class Foo(db.Model):
...
SQLAlchemy核心配置完全相同,只是用您的foo_table = Table(...)
声明替换class Foo
。
_SQLAlchemy Core配置完全相同,只是用foo_table = Table(...)声明替换Foo类._这正是我所迷惑的。所以为了使用我的表,我需要导入foo_table实例?有没有办法只导入保存所有表的元数据对象,还是我需要导入实例(因为Table()调用是在元数据创建之后)? – AHoover
@AHoover元数据对象可以在'db.metadata'获得,所以你可以导入'db'。 – univerio
是的,但是因为'metadata = Metadata()'需要在'foo_table = Table(...,metadata,...)之前被调用,所以元数据对象将不包含表格,除非表格实例在元数据对象。所以我想答案是我应该导入表实例,如果我想访问表? – AHoover