Skip to main content

Adds SQLAlchemy support to your Flask application for handle apis.

Project description

SQLAlchemy-Api-Handler is an extension that adds support for handling apis with sqlalchemy. It helps to handle models with humanized ids once it is jsonified, throws api errors for some casting of value during the save time, and dictifies model objects into jsonified ones.

[![CircleCI](https://circleci.com/gh/betagouv/sqlalchemy-api-handler/tree/master.svg?style=svg)](https://circleci.com/gh/betagouv/sqlalchemy-api-handler/tree/master) [![Coverage Status](https://coveralls.io/repos/github/betagouv/sqlalchemy-api-handler/badge.svg)](https://coveralls.io/github/betagouv/sqlalchemy-api-handler)

Installing

Install and update using pip:

$ pip install -U SQLAlchemy-Api-Handler

A Simple Example

Suppose a request POST /users {“email”: “marx.foo@plop.fr”, name: “Marx Foo”} :

from flask import Flask, jsonify, request
from sqlalchemy_api_handler import ApiHandler

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

class User(ApiHandler, db.Model):
    email = db.Column(db.String, unique=True, nullable=False)
    name = db.Column(db.String, unique=True, nullable=False)

@app.route('/users', methods=['POST'])
def post_user():
  user = User(**request.form)
  ApiHandler.save(user)
  return jsonify(as_dict(user))

The success result will have stored a user object at, let’s say id = 32, and so will fetch an object at humanized id = humanize(32), ie

{"id": "EA", "email": "marx.foo@plop.fr", name: "Marx Foo"}

Playing with nesting data

Suppose a request GET /offers

from flask import Flask, jsonify, request
from sqlalchemy.orm import relationship
from sqlalchemy_api_handler import ApiHandler

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

class Venue(ApiHandler, db.Model):
    address = db.Column(db.String, unique=True, nullable=False)
    name = db.Column(db.String, unique=True, nullable=False)

class Offer(ApiHandler, db.Model):
    name = db.Column(db.String, unique=True, nullable=False)
    venueId = db.Column(db.BigInteger,
                 db.ForeignKey("venue.id"),
                 nullable=False,
                 index=True)
    venue = relationship('Venue',
                         foreign_keys=[venueId],
                         backref='offers')

class Stock(ApiHandler, db.Model):
    available = db.Column(db.Integer, nullable=False)
    offerId = db.Column(db.BigInteger,
                     db.ForeignKey('offer.id'),
                     index=True,
                     nullable=False)
    offer = relationship('Offer',
                         foreign_keys=[offerId],
                         backref='stocks')

venue = Venue(address="Somewhere I belong", name="MyVenue")
offer = Offer(name="MyOffer")
stock = Stock(available=10)
stock.offer = offer
offer.venue = venue
ApiHandler.save(stock)

offer_includes = [
  'stocks',
  {
    "key": 'venue',
    "includes": [
      '-address'
    ]
  }
]

@app.route('/offers', methods=['GET'])
def get_offers():
  offers = Offer.query.all()
  return jsonify(as_dict(offers, includes=offer_includes))

The success will return

[
  {
    "id": "AE",
    "name": "MyOffer",
    "stocks": [
      {
        "available": 10,
        "id": "AE"
      }
    ],
    "venue": {
      "name": "MyVenue"
    }
  }
]

Deploy

First, make sure that the deploy environment is started:

./sqlaah start

In a second tab, then:

  1. Change the __version__ into sqlalchemy_api_handler/__init__.py

  2. Pre publish:

./sqlaah prepublish
  1. Publish:

./sqlaah publish

Project details


Release history Release notifications | RSS feed

This version

0.1.6

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

SQLAlchemy-Api-Handler-0.1.6.tar.gz (23.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

SQLAlchemy_Api_Handler-0.1.6-py2.py3-none-any.whl (22.7 kB view details)

Uploaded Python 2Python 3

File details

Details for the file SQLAlchemy-Api-Handler-0.1.6.tar.gz.

File metadata

  • Download URL: SQLAlchemy-Api-Handler-0.1.6.tar.gz
  • Upload date:
  • Size: 23.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.3

File hashes

Hashes for SQLAlchemy-Api-Handler-0.1.6.tar.gz
Algorithm Hash digest
SHA256 7cd272aea0677089ace59676919ac2852c7e0b3f809a3189f1b7f3ae45e014a2
MD5 7932666242a5d342fb70cd856b9d2752
BLAKE2b-256 63ae6442d0154b86df0b81b101f86ab77be147a0e740e9fe9eaa0aaaaa42229b

See more details on using hashes here.

File details

Details for the file SQLAlchemy_Api_Handler-0.1.6-py2.py3-none-any.whl.

File metadata

  • Download URL: SQLAlchemy_Api_Handler-0.1.6-py2.py3-none-any.whl
  • Upload date:
  • Size: 22.7 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.3

File hashes

Hashes for SQLAlchemy_Api_Handler-0.1.6-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 5a717386d6e992a2a57cc03b5f81efa443d9142da389d29f5c892a268d815552
MD5 0a6e9be805e21a25b0ea755d4d50e3b0
BLAKE2b-256 368bf41e75053d5b847f62fa8534e2f4dbb137d95f47687b71f254e5eb41a1d7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page