请问如何在蓝图导入主程序的数据库链接?

flask-sqlalchemy

#1

主程序__init__.py

from flask import Flask
import config
from .blueprints.edit import edit_bp
from .extensions import db

def create_app():
    app = Flask(__name__)
    app.config.from_object(config)

    @app.route('/')
    def index():
        return 'Index Page'

    db.init_app(app)
    db.reflect(app=app)
    all_table = {table_obj.name: table_obj for table_obj in db.get_tables_for_bind()}    
    for key in all_table.keys():
        print(key)
    app.register_blueprint(edit_bp, url_prefix='/edit')

    return app

edit.py

from flask import Blueprint

edit_bp = Blueprint('edit', __name__)

@edit_bp.route('/')
def edit():
    test = db.session.query(all_table['test_tbl']).filter_by(tag='Flask').all()
    return 'edit'

在edit.py中需要用到主程序中的db和all_table,那么应该如何导入?
谢谢!!


#2

麻烦看下置顶帖,设置正确的代码块格式,并设置正确的分类。

在 edit.py 导入 db 对象的话,可以直接从你的 extensions 模块导入:

from .extensions import db

all_table 那里我没这样用过,你可以试下放到 extension.py 里可不可以,如果不行的话,那估计要在 edit.py 里重新调用一下。


#3

谢谢提醒和回复!

因为第一次在这里发帖,不太熟悉。现已重新编辑设置好代码块格式和分类标签。

关于导入db,在edit.py根据你的说明已经导入成功可用。但是all_table我在edit.py中
all_table = {table_obj.name: table_obj for table_obj in db.get_tables_for_bind()}
print(all_table)
打印出的是空字典从而导致后面的all_table[‘test_tbl’]提示KeyError,但奇怪的是用
for key in all_table.keys():
print(key)
却能打印出key值。但如果把
all_table = {table_obj.name: table_obj for table_obj in db.get_tables_for_bind()}
print(all_table)
放到主程序却能正常打印出值。

另外还有一个小疑问:db是在主程序先导入extensions后再初始化可用的,也就是extensions中的db是没有初始化的,那为什么在edit.py中导入extensions中的db却可用?

谢谢!!