Python 在具有SQLAlchemy Core和flask的项目中,我应该将Table()调用放在何处以及如何使用?

Python 在具有SQLAlchemy Core和flask的项目中,我应该将Table()调用放在何处以及如何使用?,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,所以我想在应用程序中使用SQLAlchemy核心和烧瓶。我已经阅读了文档和很多教程,了解了如何构造应用程序。所有SQLAlchemy核心教程都将数据库描述直接放入应用程序的app.py文件中。我想把这个数据库描述放在它自己的python模块(这里称为tables/here)中,并在我的视图、表单等中使用它。因此,我想实现如下基本布局: myapp/ run.py tables/ __init__.py tables1.py tabl

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

myapp/
    run.py
    tables/
        __init__.py
        tables1.py
        tables2.py
        ...
    views/
        views1.py
        ...
    ...
我特别挣扎的是以下几点:

myapp/
    run.py
    tables/
        __init__.py
        tables1.py
        tables2.py
        ...
    views/
        views1.py
        ...
    ...
  • 我是否应该将
    metadata=metadata()
    放入
    表格/\uuuu init\uuuuuuuuuuuuuuuuuupy
    并将其导入
    表格/\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • 如果我想访问我的表,我是否应该简单地从
    表/tablex.py
    文件导入实例
  • 对我来说,完美的解决方案是将所有表放入元数据对象中。如果我需要访问视图中的表,我可以使用
    table=meta.tables[table\u name]
    将表从元数据中拉出。但我不知道如何传递元数据对象,以便它保存所有表
  • 或者我在这里完全走错了路,是否应该直接在我的views.py文件中创建表描述(即调用
    table=table(name,tmp\u元数据,…)
  • 感谢您抽出时间,并致以最良好的祝愿


    A.H.

    让我们一次只做一步。最小应用:

    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内容移到一个单独的模块中:

    # 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 ...
    
    # 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):
        ...
    
    接下来,我们可以拆分
    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
    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 ...
    
    # 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核心配置完全相同,除了用您的Foo_table=table(…)替换class Foo之外声明。这正是让我困惑的地方。因此,为了使用我的表,我需要导入foo_表实例?有没有办法只导入包含所有表的元数据对象,还是需要导入实例(因为table()调用是在元数据创建之后进行的)?@AHoover元数据对象位于
    db.metadata
    ,因此您可以只导入
    db
    。是的,但是在
    foo\u table=table(…,metadata,…)之前需要调用as
    metadata=metadata()
    除非在元数据对象之前导入表实例,否则元数据对象不会包含表。因此,我想答案是,如果我想访问表,我应该导入表实例?@AHoover
    db=SQLAlchemy(app)
    初始化元数据。它保证在您的表声明之前执行,因为我们从
    foo.py
    导入
    db
    ,并且我们保证导入您的表声明,因为我们从
    db/\uuuu init\uuuuuu.py
    中的
    导入将
    从sqlalchemy导入元数据
    Metadata=Metadata()
    放入
    common.py
    从.common导入元数据
    从.foo导入foo_表
    (其中
    foo_表=表(…)
    foo.py
    中),然后我可以简单地从.db导入元数据
    ,然后
    元数据
    对象将保存我的所有表定义,如
    foo_table
    ?或者我可以使用
    从.db导入foo_table
    导入我的表。如果是这样,我很乐意接受您的回答!