Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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 炼金术:可以';在回滚无效事务之前,请不要重新连接_Python_Mysql_Amazon Web Services_Flask_Flask Sqlalchemy - Fatal编程技术网

Python 炼金术:可以';在回滚无效事务之前,请不要重新连接

Python 炼金术:可以';在回滚无效事务之前,请不要重新连接,python,mysql,amazon-web-services,flask,flask-sqlalchemy,Python,Mysql,Amazon Web Services,Flask,Flask Sqlalchemy,因此,我使用AmazonWebServicesRDS来运行MySQL服务器,使用Python的Flask框架来运行应用程序服务器,并使用FlaskSqlAlchemy来与RDS接口 我的应用程序config.py SQLALCHEMY_DATABASE_URI = '<RDS Host>' SQLALCHEMY_POOL_RECYCLE = 60 我有我的主应用程序.py from flask import Flask from application import db impo

因此,我使用AmazonWebServicesRDS来运行MySQL服务器,使用Python的Flask框架来运行应用程序服务器,并使用FlaskSqlAlchemy来与RDS接口

我的应用程序config.py

SQLALCHEMY_DATABASE_URI = '<RDS Host>'
SQLALCHEMY_POOL_RECYCLE = 60
我有我的主应用程序.py

from flask import Flask
from application import db
import flask.ext.restless
from application.models import Person

application = Flask(__name__)
application.debug=True
db.init_app(application)

@application.route('/')
def index():
    return "Hello, World!"

manager = flask.ext.restless.APIManager(application, flask_sqlalchemy_db=db)
manager.create_api(Person, methods=['GET','POST', 'DELETE'])

if __name__ == '__main__':
    application.run(host='0.0.0.0')
模特们

class Person(db.Model):
    __bind_key__= 'people'
    id = db.Column(db.Integer, primary_key=True)
    firstName = db.Column(db.String(80))
    lastName = db.Column(db.String(80))
    email = db.Column(db.String(80))

    def __init__(self, firstName=None, lastName=None, email=None):
        self.firstName = firstName
        self.lastName = lastName
        self.email = email
在db创建和应用程序启动后,我有一个脚本来填充数据库以进行测试:

from application import db
from application.models import Person

person = Person('Bob', 'Jones', 'bob@website.net')
db.session.add(person)
db.session.commit()
使用db.drop_all()和db.create_all()重置数据库后,我启动application.py,然后启动脚本来填充数据库

服务器将使用正确的JSON进行响应,但是如果我在几个小时后返回并检查它,我会得到需要回滚的错误,或者有时是MySQL服务器已经消失的2006年错误

人们建议我更改MySQL服务器上的超时设置,但这并没有解决任何问题。以下是我的设置:

innodb_lock_wait_timeout = 3000
max_allowed_packet       = 65536
net_write_timeout        = 300
wait_timeout             = 300
然后当我查看RDS监视器时,它显示MySQL服务器将连接保持打开状态很长一段时间,直到超时。如果我错了,请纠正我,但连接不应该在完成后关闭吗?应用服务器似乎一直在确保数据库连接存在,然后当MySQL服务器超时时,Flask/Flask SQLAlchemy抛出一个错误并导致应用服务器停机


任何建议都将不胜感激,谢谢

我想它增加了什么

db.init_app(application)

在application.py中,此后没有出现错误。

或者,在填充数据库的脚本末尾使用此选项:

db.session.close()

这应该可以防止那些恼人的“MySQL服务器已经消失”错误。

每次检查回滚与否都很麻烦

我制作了需要提交的插入、更新函数

@app.teardown_request
def session_clear(exception=None):
    Session.remove()
    if exception and Session.is_active:
        Session.rollback()

这里您缺少池回收,因为MySql在一段时间后关闭会话,所以您需要添加池回收,以便池中的连接在池回收时间后重新连接


app.config['SQLALCHEMY\u POOL\u RECYCLE']=3600

此错误通常在将SQLALCHEMY引擎创建为单例时出现。在这种情况下,在连接失效后(在我的情况下是3600秒),您会得到InvalidTransaction错误

最好的建议是在应用程序初始化时初始化db会话

db.init_app(app)
并在需要执行CRUD操作时导入此db会话


从未在我的应用程序上发布过此更改。

从一开始,事务似乎没有问题,但这可能是由MySQL错误引起的,例如对等方事先重置连接。这意味着您的连接丢失,可能是因为您的应用程序上下文设置不正确

一般来说,最好使用创建应用程序。这有很多优点,您的代码是

  • 易于阅读和设置
  • 更容易测试
  • 避免循环进口
为了防止无效事务错误(这可能是由
操作错误:对等方重置连接引起的)
,您应该确保正确处理数据库连接

下面的示例基于此,很好地解释了flask应用程序上下文以及如何将其用于数据库连接或任何其他扩展

application.py

from flask import Flask
from application import db
import flask.ext.restless
from application.models import Person

application = Flask(__name__)
application.debug=True
db.init_app(application)

@application.route('/')
def index():
    return "Hello, World!"

manager = flask.ext.restless.APIManager(application, flask_sqlalchemy_db=db)
manager.create_api(Person, methods=['GET','POST', 'DELETE'])

if __name__ == '__main__':
    application.run(host='0.0.0.0')

从烧瓶进口烧瓶
从flask_sqlalchemy导入sqlalchemy
def create_app():
“”“构造核心应用程序。”“”
应用=烧瓶(名称)
application.config.from_object('config')#Set globals
db=SQLAlchemy()
使用application.app_context():
#在应用程序上下文中初始化全局/扩展
db.init_应用程序(应用程序)
#这里的进口路线
从…起进口路线
退货申请
如果名称=“\uuuuu main\uuuuuuuu”:
app=create_app()
应用程序运行(host=“0.0.0.0”)
routes.py

从flask导入当前应用程序作为应用程序
@application.route('/',methods=['GET'])
def index():
返回“你好,世界!”

如果您仍然遇到断开连接问题,您还应该查看上的SQLAlchemy文档并查看一下。

我已经尝试过这个方法,但没有帮助,我认为它不起作用,因为Flask SQLAlchemy(而不仅仅是SQLAlchemy)已经为您关闭了连接。我只是正确地初始化了它。自从我调用init_应用程序以来,就没有出现过错误。不过,谢谢你的反馈!这可能对以后的人有帮助!?我不得不在db.session.no_autoflush:中使用
来修复Flask中的一些奇怪之处。结果,我的PaaS(Heroku)步履蹒跚。通过在“with”语句之前放置
db.session.close()
,解决了这个问题。不是在恋爱中,但一切都在起作用。烧瓶炼金术为你。哦。。谢谢我不知道,但我不使用炼金术来减少包装dependency@leejaycoke我使用的是原始sqlalchemy,我对Flask Admin在延长时间后达到需要回滚的状态有疑问。我有一个
会话。remove()
拆卸,但将尝试添加此异常部分tomorrow@leejaycoke这个问题是关于炼金术的。如果答案不相关,你应该删除它。他在这里:
db=SQLAlchemy(application)
。你所做的是重新初始化。@KanstantsinKamkou是的,但我有相同的设置,这个额外的初始化也为我修复了它。“看看它为什么会修复它会很有趣。”Leonover觉得在原来的帖子中,它之所以有帮助是因为他在application.pyi的第6行用一个新的Flask(name)实例覆盖了他的应用程序定义,并关闭了我的应用程序的进程,重新启动了应用程序。它和平地工作了!我已经将这一行添加到我的服务器,但它仍然有相同的问题。谁能帮我?这正是我的设置,我创建了一个单例类,在这个类中,我的数据库是使用
create\u engine(…)
初始化的。你能解释一下为什么会发生这种情况吗?它是d