2016-05-03 2 views
1

Я унаследовал приложение, использующее python & sqlalchemy для взаимодействия с базой данных mysql. Когда я выдаю:create_engine проблемы mysql 5.7 и sqlalchemy

mysql_engine = sqlalchemy.create_engine('mysql://uname:[email protected]: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. После этого я могу с радостью переключиться на базу данных MySQL, используя вышеприведенное заявление create_engine. Тем не менее, при перезагрузке соединение с базой данных MySQL снова завершится неудачей, по умолчанию для встроенного sqlite db и т. Д. И т. Д.

Есть ли у кого-нибудь какие-либо предложения относительно того, как это может произойти?

Просто подумал, что я обновил бы это - проблема все еще происходит точно так, как описано выше. Я обновил приложение, чтобы пользователь мог вручную подключиться к MySQL db, выбрав опцию меню. Это вызывает идентичный код, исключения которого при запуске приложения, но отлично работает, когда приложение запущено и работает.

Экземпляр MySQL полностью отделен от приложения и работает повсюду, поэтому он должен быть доступен для приема соединений в любое время.

Я думаю, что основной вопрос, с которым я сталкиваюсь, заключается в том, как может работать тот же самый код соединения, когда приложение запущено и работает, но генерирует исключение при его запуске?

Есть ли артефакт SQLAlchemy, который может привести к сбою в создании полезных подключений, которые не зависят от параметров подключения или удаленной базы данных?

+0

Что вы имеете в виду Python умирает? Исключение? Segfault? Нет выхода? – univerio

+0

@univerio - извините, я действительно не предоставил достаточную информацию там - исключение поднято, я добавил несколько подробностей ... – RadioRaheem

ответ

0

Ааа, все это кажется настолько очевидным теперь ...

Причины исключения при запуске потому, что сетевой интерфейс не закончила настройку, когда приложение сделает свой первый запрос к удаленной базе данных. (Вот почему то же самое было бы успешным при попытке позже).

В связи с удаленной базой данных является необходимым условием для применения, теперь я сделать что-то вроде этого:

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 

... в сценарии запуска для моего приложения - обеспечение того, чтобы сетевой интерфейс закончили настройку перед запуском приложения.

Конечно, приложение будет никогда бежать, если интерфейс не настроить, поэтому он все еще нуждается в ловко, чтобы позволить ему тайм-аут и по умолчанию, используя локальную базу данных ...