我在哪里放置以及如何使用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 
     ... 
    ... 

什么我挣扎尤其是以下几点:

  1. 我应该把metadata = MetaData()tables/__init__.py并在tables/__init__.py文件导入呢?
  2. 如果我想访问我的表,我应该从tables/tablesX.py文件简单地导入实例吗?
  3. 对我来说最完美的解决方案是将所有表放入元数据对象中。如果我然后需要访问例如我可以简单地将表格从table = meta.tables[table_name]中抽出来。但我不知道如何传递元数据对象,以保存所有的表。
  4. 还是我在这里完全地在错误的道路上我应该创建表的说明(即称之为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

+0

_SQLAlchemy Core配置完全相同,只是用foo_table = Table(...)声明替换Foo类._这正是我所迷惑的。所以为了使用我的表,我需要导入foo_table实例?有没有办法只导入保存所有表的元数据对象,还是我需要导入实例(因为Table()调用是在元数据创建之后)? – AHoover

+0

@AHoover元数据对象可以在'db.metadata'获得,所以你可以导入'db'。 – univerio

+0

是的,但是因为'metadata = Metadata()'需要在'foo_table = Table(...,metadata,...)之前被调用,所以元数据对象将不包含表格,除非表格实例在元数据对象。所以我想答案是我应该导入表实例,如果我想访问表? – AHoover