pyeve / eve-sqlalchemy

SQLAlchemy data layer for Eve-powered RESTful APIs
http://eve-sqlalchemy.readthedocs.io
Other
233 stars 70 forks source link

Flask-SQLAlchemy integration does not work. #169

Open ShigeruNakagaki opened 6 years ago

ShigeruNakagaki commented 6 years ago

for example, db is a SQLAlchemy instance of flask_sqlalchemy. app is a Flask(name) instance of flask. FlaskSQL class inherits SQL class of eve_sqlalchemy and the driver is db.

at db.init_app(app), there are mapping information in db.Model._decl_class_registry.data. But driver.Model._decl_class_registry.data of FlaskSQL instance is empty. So, at line 297 in eve_sqlalchemy/__init__.py, it said KeyError because there is no mapping information.

class Hoge(db.Model): . . .


this code does not match with [a tutorial](https://eve-sqlalchemy.readthedocs.io/en/latest/tutorial.html#using-flask-sqlalchemy).

thanks
ajw0100 commented 6 years ago

I solved this by overriding the init_app method of eve_sqlalchemy.SQL which allows you to specify your own db as driver :

from eve import Eve
from eve.io.base import ConnectionException
from eve_sqlalchemy import SQL as _SQL
from eve_sqlalchemy.validation import ValidatorSQL

from my_models import db

class SQL(_SQL):
    # https://github.com/pyeve/eve-sqlalchemy/blob/0.5.0/eve_sqlalchemy/__init__.py#L47-L55
    def init_app(self, app):
        try:
            # FIXME: dumb double initialisation of the
            # driver because Eve sets it to None in __init__
            self.driver = db
            self.driver.app = app
            self.driver.init_app(app)
        except Exception as e:
            raise ConnectionException(e)

app = Eve(validator=ValidatorSQL, data=SQL)