繁体   English   中英

create_engine问题mysql 5.7和sqlalchemy

[英]create_engine problems mysql 5.7 and sqlalchemy

我继承了一个使用python和sqlalchemy与mysql数据库交互的应用程序。 当我发出:

mysql_engine = sqlalchemy.create_engine('mysql://uname:pwd@192.168.xx.xx:3306/testdb', connect_args={'use_unicode':True,'charset':'utf8', 'init_command':'SET NAMES UTF8'}, poolclass=NullPool)

,在启动时,抛出异常:

cmd = unicode("USE testdb")    
with mysql_engine.begin() as conn:
      conn.execute(cmd)

sqlalchemy.exc.OperationalError: (OperationalError) (2003, "Can't connect to MySQL server on '192.168.xx.xx' (101)") None None

但是,使用IDLE,我可以这样做:

>>> import MySQLdb
>>> Con = MySQLdb.Connect(host="192.168.xx.xx", port=3306, user="uname", passwd="pwd", db="testdb")
>>> Cursor = Con.cursor()
>>> sql = "USE testdb"
>>> Cursor.execute(sql)

此时应用程序默认使用板载sqlite数据库。 在此之后,我可以使用上面的create_engine语句切换到MySQL数据库。 但是,在重新启动时,MySQL数据库连接将再次失败,默认为板载sqlite db等,等等。

有没有人有任何关于如何发生这种情况的建议?

只是想我会更新这个 - 问题仍然完全如上所述。 我已经更新了应用程序,以便用户可以通过选择菜单选项手动连接到MySQL数据库。 这会调用应用程序启动时异常的相同代码,但是一旦应用程序启动并运行,它就可以正常工作。

MySQL实例完全独立于应用程序并在整个运行中运行,因此它应始终可用于接收连接。

我想我正在努力解决的基本问题是,当应用程序启动并运行时,相同的连接代码如何工作,但在启动时抛出异常?

是否有任何SQLAlchemy工件可能导致它无法创建不依赖于连接参数或远程数据库的可用连接?

啊,现在这一切似乎都很明显......

启动时出现异常的原因是因为当应用程序向远程数据库发出第一个请求时,网络接口尚未完成配置。 (这就是为什么在以后尝试同样的事情会成功的原因)。

由于与远程数据库的通信是应用程序的先决条件,我现在做这样的事情:

if grep -Fxq "mysql" /path/to/my/db/config.config
then
    while ! ip a | grep inet.*wlan0 ; do sleep 1; echo "waiting for network..."; done;
fi

...在我的应用程序的启动脚本中 - 确保在应用程序运行之前网络接口已完成配置。

当然,如果接口没有配置,应用程序将永远不会运行,因此它仍然需要一些功能来允许它超时并默认使用本地数据库...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM