Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Local MySQLdb connection fails with AttributeError for paramstyle when running GAE development server

I'm building a GAE Flask application with Flask-Alchemy, against Cloud SQL, and running dev_appserver to test the application as I build it.

However, if I set the SQLALCHEMY_DATABASE_URI to a mysql+gaerdbms:///appname?instance=instanceid URL, I get the following traceback when trying to call 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' 

What gives? Why is the (DB-API 2.0 required) paramstyle attribute missing?

like image 677
Martijn Pieters Avatar asked Dec 06 '13 21:12

Martijn Pieters


1 Answers

This means the MySQLdb module is missing and failed to import. The GAE SDK does not itself come with the MySQLdb client library; install MySQLdb (as instructed in the SDK documentation):

venv/bin/pip install mysql-python 

or use your OS package manager to install MySQLdb in your system python.

The error is caused by the Google google.appengine.api.rdbms_mysqldb module, acting as a stub, not having a paramstyle attribute when import MySQLdb fails. A stub connect() function is provided that'll raise a more helpful exception, but due to an unfortunate interaction with SQLAlchemy the error there is a lot less informative.

like image 55
Martijn Pieters Avatar answered Sep 19 '22 14:09

Martijn Pieters