17

I'm trying to develop a web api using flask and sqlite. For communication with db I'm using sqlalchemy.

In the code that I post below I have create a GET method to retrieve all data into a specific table into db:

from flask import Flask, g, Response, request, jsonify, abort
from flask_restful import Resource, Api
from sqlalchemy import create_engine
from flask.ext.restless import APIManager
from flask.ext.sqlalchemy import SQLAlchemy
from json import dumps
import sqlite3
import json


app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///climb.db"
db = SQLAlchemy(app)

class falesie(db.Model):
    __tablename__ = 'falesie'
    id = db.Column(db.Integer, primary_key=True)
    regione = db.Column(db.String(20))
    citta = db.Column(db.String(20))
    n_settori = db.Column(db.Integer)
    lat = db.Column(db.Float)
    lon = db.Column(db.Float)

    def __init__(self, regione, citta, n_settori, lat, lon):
      self.regione = regione
      self.citta = citta
      self.n_settori= n_settori
      self.lat = lat
      self.lon = lon

@app.route('/dev', methods = ['GET'])
def get_falesie():
    Falesie = falesie.query.all()
    formatted_falesie = []
    for f in Falesie:
        formatted_falesie.append({
        'id': f.id,
        'regione': f.regione,
        'citta': f.citta,
        'n_settori': f.n_settori,
        'lat': f.lat,
        'lon': f.lon})
    return json.dumps({'Falesie': formatted_falesie}), 200, {'Content-  Type': 'application/json'}


if __name__ == "__main__":
    db.create_all()
    app.run(debug=True)

I would like to create a GET method to retrieve a specific record with a specific value, as in this example:

@app.route('dev/<string:name>')
def get_data(name):

I don't know how to retrieve a single record. Any help please?

2
  • 1
    Which field do you want to use when querying falesie? It doesn't have a field name. Commented Mar 3, 2016 at 14:14
  • the field name is an example, the field is citta. Commented Mar 3, 2016 at 16:50

4 Answers 4

20

This should help with getting a single result of falesie:

try:
    user = session.query(falesie).filter(name=name).one()  # filter on name
except MultipleResultsFound, e:
    print e
    # Deal with it
except NoResultFound, e:
    print e
    # Deal with that as well

Where session is obtained as following:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# an Engine, which the Session will use for connection resources
engine = create_engine('sqlite:///climb.db')

# create a configured "Session" class
Session = sessionmaker(bind=engine)

# create a Session
session = Session()

See SQLAlchemy documentation for more details.

Sign up to request clarification or add additional context in comments.

1 Comment

This should be filter_by, right? Maybe the API has changed since 2016?
15

If you read the tutorial, you'll see that you can filter your query. Something like this should be what you want:

falesie.query().filter_by(id=name).first()

1 Comment

Remember query is not callable, use falesie.query.filter_by(id=name).first()
4

Question is very old but one more technique can help to others having problem.

def load_user(id):
    falesie.query.get(int(id))

1 Comment

2

For those now here looking for a way with SQLAlchemy 2.0--you can use this method (get_one()):

from sqlalchemy.orm import Session
from sqlalchemy.orm.exc import NoResultFound

# create your session

try:
    obj = session.get_one(YourDbModel, pk_id)
except NoResultFound:
    # handle

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.