I'm new to Flask and SQLAlchemy and I have spent so much time trying to get my database query to present as JSON using a Flask url (not flask_restful).
I thought I had it working by using n0nSmoker/SQLAlchemy-serializer. It worked using a simple query using this syntax selecting my Trade SQLAlchemy class:
trades = Trade.query.all()
I was able to return trades.to_dict() with no problem.
However because I need to do a group_by
, I need to use the more flexible syntax of db.session.query(Trade, Trade.exchange, Trade.trader.......
etc this method stopped working.
I have looked at other options like the inspection system but it seems a bit beyond my skill level. Plus it seems like some of the methods like _asdict() aren't available at the row level.
I'm a bit lost and not sure how to proceed. Any help would be hugely appreciated.
Edit: More code requested:
top of app.py
from flask import Flask
from flask_restful import Resource, Api
from models import *
from flask_sqlalchemy import SQLAlchemy
from sqlathanor import FlaskBaseModel, initialize_flask_sqlathanor
app = Flask(__name__)
app.config.from_pyfile('config.py')
db = SQLAlchemy(model_class = FlaskBaseModel)
db = initialize_flask_sqlathanor(db)
class Trades(Resource):
def get(self):
return AllTrades()
api.add_resource(Trades,'/')
if __name__ == '__main__':
app.run(host="0.0.0.0")
from models.py
from app import db
class Trade(db.Model):
id = db.Column(db.Integer, primary_key=True)
exchange = db.Column(db.String(255))
trader = db.Column(db.String(255))
symbol = db.Column(db.String(255))
coin = db.Column(db.String(255))
order_id = db.Column(db.String(255))
price = db.Column(db.String(255))
qty = db.Column(db.String(255))
fee = db.Column(db.String(255))
fee_currency = db.Column(db.String(255))
order_time = db.Column(db.DateTime(timezone=False))
side = db.Column(db.String(255))
maker_taker = db.Column(db.String(255))
def AllTrades():
#t = Trade
# trades = db.session.query(
# t,
# t.exchange,
# t.trader,
# t.symbol,
# t.coin,
# db.func.sum(t.qty),
# db.func.sum(t.fee).label("fee"),
# t.fee_currency,
# t.order_id,
# t.order_time,
# t.maker_taker
# ).group_by(t.order_id).all()
trades = Trade.query.all()
trades = trades.to_json()
return trades
Full stack trace
Traceback (most recent call last):
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask_restful/__init__.py", line 273, in error_router
return original_handler(e)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 32, in reraise
raise value.with_traceback(tb)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask_restful/__init__.py", line 273, in error_router
return original_handler(e)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 32, in reraise
raise value.with_traceback(tb)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask_restful/__init__.py", line 480, in wrapper
resp = resource(*args, **kwargs)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask/views.py", line 84, in view
return self.dispatch_request(*args, **kwargs)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask_restful/__init__.py", line 595, in dispatch_request
resp = meth(*args, **kwargs)
File "/Users/foo/Sites/Reporting_dev/app.py", line 18, in get
return AllTrades()
File "/Users/foo/Sites/Reporting_dev/models.py", line 42, in AllTrades
trades = Trade.query.all()
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 514, in __get__
return type.query_class(mapper, session=self.sa.session())
File "/Users/foo/anaconda3/lib/python3.6/site-packages/sqlalchemy/orm/scoping.py", line 74, in __call__
return self.registry()
File "/Users/foo/anaconda3/lib/python3.6/site-packages/sqlalchemy/util/_collections.py", line 1001, in __call__
return self.registry.setdefault(key, self.createfunc())
File "/Users/foo/anaconda3/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2939, in __call__
return self.class_(**local_kw)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 143, in __init__
bind = options.pop('bind', None) or db.engine
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 877, in engine
return self.get_engine()
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 887, in get_engine
state = get_state(app)
File "/Users/foo/anaconda3/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 570, in get_state
'The sqlalchemy extension was not registered to the current ' \
AssertionError: The sqlalchemy extension was not registered to the current application. Please make sure to call init_app() first.