我在哪里放置以及如何在SQLAlchemy Core和flask项目中使用Table()调用?

时间:2016-05-30 16:25:37

标签: python sqlalchemy flask-sqlalchemy

所以我想在应用程序中使用SQLAlchemy Core和flask。我已经阅读了文档和许多教程,了解如何构建应用程序。所有SQLAlchemy Core教程都将数据库描述直接放入应用程序的app.py文件中。我想将这个数据库描述放入它自己的python模块(在这里称为tables /),并在我的视图,表单等中使用它。所以我想实现如下的基本布局:

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. 或者我完全在错误的路径上,我是否应该创建表格描述(即直接在我的views.py文件中调用table = Table(name, tmp_metadata,...)
  5. 感谢您的时间和祝福,

    A.H。

1 个答案:

答案 0 :(得分:0)

让我们一步一步做。最小的申请:

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 ...

让我们将数据库内容移到一个单独的模块中:

# 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 Core配置完全相同,只是将class Foo声明替换为foo_table = Table(...)