Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Flask factory设置中反映不同的数据库_Python_Python 3.x_Flask_Flask Sqlalchemy - Fatal编程技术网

Python 在Flask factory设置中反映不同的数据库

Python 在Flask factory设置中反映不同的数据库,python,python-3.x,flask,flask-sqlalchemy,Python,Python 3.x,Flask,Flask Sqlalchemy,我想使用Flask的应用程序工厂机制fpr我的应用程序。我必须指出的是,我在一些蓝图中使用的数据库位置不同,所以我使用绑定来指向它们。这些表本身正在生产中,并且已经在使用中,因此我需要反映它们,以便在我的应用程序中使用它们 问题是,由于应用程序上下文的原因,我无法使reflect函数工作。我总是得到这样的信息,即我在应用程序上下文之外工作。我完全理解这一点,并且看到,db确实在外部,但我不知道如何参与进来 我尝试了通过当前的应用程序将应用程序传递到我的models.py的不同版本,但没有任何效果

我想使用Flask的应用程序工厂机制fpr我的应用程序。我必须指出的是,我在一些蓝图中使用的数据库位置不同,所以我使用绑定来指向它们。这些表本身正在生产中,并且已经在使用中,因此我需要反映它们,以便在我的应用程序中使用它们

问题是,由于应用程序上下文的原因,我无法使reflect函数工作。我总是得到这样的信息,即我在应用程序上下文之外工作。我完全理解这一点,并且看到,db确实在外部,但我不知道如何参与进来

我尝试了通过当前的应用程序将应用程序传递到我的models.py的不同版本,但没有任何效果

config.py:

类配置(对象):
#密钥
秘密密钥='我的秘密密钥'
每页项目=25
SQLALCHEMY_绑定={
'mysql_bind':'mysql+mysqlconnector://localhost:3306/tmpdb'
}
SQLALCHEMY\u TRACK\u MODIFICATIONS=False
main.py:

从webapp导入创建应用程序
app=create_app('config.config'))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run(debug=true)
webapp/init.py:

从烧瓶导入烧瓶
从flask_sqlalchemy导入sqlalchemy
db=SQLAlchemy()
def创建应用程序(配置对象):
app=烧瓶(名称)
app.config.from_对象(config_对象)
db.init_应用程序(应用程序)
从主导入创建模块作为主创建模块
主创建模块(应用程序)
返回应用程序
webapp/main/init.py:

def创建_模块(应用程序):
从.controller导入蓝图
应用程序注册(蓝图)
webapp/main/controller.py:

从flask导入蓝图、渲染_模板、当前_应用程序作为应用程序

从.models import db,MyTable#开始工作,完整解决方案如下:

我已经使用sqllite3进行了测试,运行create_db.py脚本来设置数据库。使用debug.sh运行flask,因为最新版本的应用程序中似乎不再只包含app.Run()

解释

据我所知,如果您需要在单个应用程序中或跨多个应用程序多次使用多个视图,蓝图只是将多个视图组合在一起的一种方式。您可以根据需要添加不同的路由前缀

db对象与蓝图不关联,它与提供配置信息的应用程序关联。进入blueprint视图后,您将可以使用自动可用的相关应用程序上下文访问db对象。 关于db.reflect,您需要在create_app中进行调用,并将app对象传递给它(首选),或者将app导入到意大利面条模型中

如您所示,可以使用绑定访问多个数据库

因此,您的蓝图将可以访问所有导入的表,并且sqlalchemy根据绑定知道要使用哪个db连接

我通常喜欢显式定义表,这样您就可以在代码完成时访问ORM对象和字段。您是否有很多表/字段,或者您正在创建一些查询表元数据的内容,以便在任何模式上实现完全自动化?比如模式查看器之类的

这可能对其他来此帖子的人有用:
太棒了!非常感谢你。它也起作用了。你的提示给了我另一种方法:

@blueprint.route(“/”)
def index():
#按app_context()导入MyTable
#现在我也可以在models.py中使用db.reflect()
使用app.app_context():
从.models导入MyTable
results=db.session.query(MyTable).all()
打印(结果)
对于结果中的行:
打印(行)
打印(行版本)
打印(行名称)
如果结果是:
返回渲染模板('my_table.html',results=results)
其他:
返回“没有发生任何事情”
然后可以在models.py内进行反射。你发布的链接真的很有帮助,不知道为什么我自己没有被它绊倒

无论如何,我现在确实比以前有更多的可能性


干杯,伙计

你能帮我试试这个吗,我想你需要用这个应用注册数据库。db=SQLAlchemy(app)而不是db=SQLAlchemy()。注意,我发现在某些情况下,只使用香草精炼金术和烧瓶更容易。上下文和将所有内容连接在一起会变得不那么痛苦。这是正常的行为,但在工厂设置中,您更愿意按照我上面描述的方式进行。事实上,使用
db.init_app(app)
db=SQLAlchemy(app)
是一样的。在我描述的示例中,它不会有什么区别,因为db对象在
models.py中都不可调用,无论哪种方式,它都只能在没有工厂设置的情况下使用Flask和SQLAlchemy(您称之为“香草SQLAlchemy”)。嗯,我尝试了很多,但这个问题似乎无法解决。唯一的解决方案是跳过
webapp/\uuuuu init\uuuuuuuuuupy
中的
create\u app
,并在导入时初始化数据库。因此,它可以减少头痛。好的,老的,普通的“香草瓶”。)在
db.init\u app(app)
include
db.reflect(app=app)
行后尝试
create\u app()
。我仍然认为这是可能的,但如果没有多个app,就没有必要使用app factory。以后可能会玩这个。太棒了!这种上下文相关的导入非常聪明,这是你从未想过的。这取决于你可能需要访问数据库的频率。在我的代码中,您可能必须在每条路线中从
models.py
导入,使用您的方法可以访问所有蓝图。