Сбой локального соединения MySQLdb с AttributeError для paramstyle при запуске сервера разработки GAE

Я создаю приложение GAE Flask с помощью Flask-Alchemy для Cloud SQL и запускаю dev_appserver для тестирования приложения по мере его создания.

Однако, если я устанавливаю SQLALCHEMY_DATABASE_URI в URL-адрес mysql+gaerdbms:///appname?instance=instanceid, я получаю следующую трассировку при попытке вызвать db.create_all():

Traceback (most recent call last):
  # earlier lines omitted for brevity
  File "/Project/app/foo.bar/foo/bar/admin/__init__.py", line 26, in init_db
    db.create_all()
  File "/Project/app/distlib/flask_sqlalchemy/__init__.py", line 856, in create_all
    self._execute_for_all_tables(app, bind, 'create_all')
  File "/Project/app/distlib/flask_sqlalchemy/__init__.py", line 848, in _execute_for_all_tables
    op(bind=self.get_engine(app, bind), tables=tables)
  File "/Project/app/distlib/flask_sqlalchemy/__init__.py", line 797, in get_engine
    return connector.get_engine()
  File "/Project/app/distlib/flask_sqlalchemy/__init__.py", line 473, in get_engine
    self._engine = rv = sqlalchemy.create_engine(info, **options)
  File "/Project/app/distlib/sqlalchemy/engine/__init__.py", line 332, in create_engine
    return strategy.create(*args, **kwargs)
  File "/Project/app/distlib/sqlalchemy/engine/strategies.py", line 69, in create
    dialect = dialect_cls(**dialect_args)
  File "/Project/app/distlib/sqlalchemy/dialects/mysql/base.py", line 1986, in __init__
    default.DefaultDialect.__init__(self, **kwargs)
  File "/Project/app/distlib/sqlalchemy/engine/default.py", line 124, in __init__
    self.paramstyle = self.dbapi.paramstyle
AttributeError: 'module' object has no attribute 'paramstyle'

Что дает? Почему отсутствует атрибут paramstyle (требуется DB-API 2.0)?


person Martijn Pieters    schedule 06.12.2013    source источник


Ответы (1)


Это означает, что модуль MySQLdb отсутствует и его не удалось импортировать. GAE SDK сам по себе не поставляется с клиентской библиотекой MySQLdb; установите MySQLdb (как указано в документации SDK):

venv/bin/pip install mysql-python

или используйте диспетчер пакетов ОС для установки MySQLdb в системный python.

Ошибка вызвана тем, что модуль Google google.appengine.api.rdbms_mysqldb, работающий как заглушка, не имеет атрибута paramstyle при сбое import MySQLdb. Предоставляется функция-заглушка connect(), которая вызовет более полезное исключение, но из-за неудачного взаимодействия с SQLAlchemy ошибка намного менее информативна.

person Martijn Pieters    schedule 06.12.2013
comment
Это также может означать, что есть какая-то другая проблема с импортом MySQLdb. Это тоже было полезно: stackoverflow.com/questions/6383310/ - person David Underhill; 11.12.2014