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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.