Skip to content

Commit

Permalink
SQLAlchemy example first import.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmusatti committed Jun 2, 2016
1 parent a83598d commit 1a167ff
Show file tree
Hide file tree
Showing 5 changed files with 225 additions and 0 deletions.
15 changes: 15 additions & 0 deletions examples/sqlalchemy/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
==================
SQLAlchemy Example
==================

A simple example of how one might use SQLAlchemy as a backing store for a
Connexion based application.

Running:

.. code-block:: bash
$ sudo pip3 install -r requirements.txt
$ ./app.py
Now open your browser and go to http://localhost:8080/ui/ to see the Swagger UI.
61 changes: 61 additions & 0 deletions examples/sqlalchemy/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#!/usr/bin/env python3
import connexion
import datetime
import logging

from connexion import NoContent

import orm


db_session = None

def get_pets(limit, animal_type=None):
q = db_session.query(orm.Pet)
if animal_type:
q = q.filter(orm.Pet.animal_type == animal_type)
return [ p.dump() for p in q][:limit]

def get_pet(pet_id):
pet = db_session.query(orm.Pet).filter(orm.Pet.id == pet_id).one_or_none()
return pet.dump() or ('Not found', 404)


def put_pet(pet_id, pet):
p = db_session.query(orm.Pet).filter(orm.Pet.id == pet_id).one_or_none()
pet['id'] = pet_id
if p is not None:
logging.info('Updating pet %s..', pet_id)
p.update(**pet)
else:
logging.info('Creating pet %s..', pet_id)
pet['created'] = datetime.datetime.utcnow()
db_session.add(orm.Pet(**pet))
db_session.commit()
return NoContent, (200 if p is not None else 201)


def delete_pet(pet_id):
pet = db_session.query(orm.Pet).filter(orm.Pet.id == pet_id).one_or_none()
if pet is not None:
logging.info('Deleting pet %s..', pet_id)
db_session.query(orm.Pet).filter(orm.Pet.id == pet_id).delete()
db_session.commit()
return NoContent, 204
else:
return NoContent, 404

logging.basicConfig(level=logging.INFO)
db_session = orm.init_db('sqlite:///:memory:')
app = connexion.App(__name__)
app.add_api('swagger.yaml')

application = app.app

@application.teardown_appcontext
def shutdown_session(exception=None):
db_session.remove()


if __name__ == '__main__':
app.run(port=8080)
35 changes: 35 additions & 0 deletions examples/sqlalchemy/orm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from sqlalchemy import create_engine, Column, DateTime, String
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()


class Pet(Base):
__tablename__ = 'pets'
id = Column(String(20), primary_key=True)
name = Column(String(100))
animal_type = Column(String(20))
created = Column(DateTime())

def update(self, id=None, name=None, animal_type=None, tags=None,
created=None):
if name is not None:
self.name = name
if animal_type is not None:
self.animal_type = animal_type
if created is not None:
self.created = created

def dump(self):
return dict([(k,v) for k,v in self.__dict__.items() if k[0] != '_'])


def init_db(uri):
engine = create_engine(uri, convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False,
bind=engine))
Base.query = db_session.query_property()
Base.metadata.create_all(bind=engine)
return db_session
3 changes: 3 additions & 0 deletions examples/sqlalchemy/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
connexion>=1.0.97
Flask==0.10.1
SQLAlchemy>=1.0.13
111 changes: 111 additions & 0 deletions examples/sqlalchemy/swagger.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
swagger: '2.0'
info:
title: Pet Shop Example API
version: "0.1"
consumes:
- application/json
produces:
- application/json
paths:
/pets:
get:
tags: [Pets]
operationId: app.get_pets
summary: Get all pets
parameters:
- name: animal_type
in: query
type: string
pattern: "^[a-zA-Z0-9]*$"
- name: limit
in: query
type: integer
minimum: 0
default: 100
responses:
200:
description: Return pets
schema:
type: array
items:
$ref: '#/definitions/Pet'
/pets/{pet_id}:
get:
tags: [Pets]
operationId: app.get_pet
summary: Get a single pet
parameters:
- $ref: '#/parameters/pet_id'
responses:
200:
description: Return pet
schema:
$ref: '#/definitions/Pet'
404:
description: Pet does not exist
put:
tags: [Pets]
operationId: app.put_pet
summary: Create or update a pet
parameters:
- $ref: '#/parameters/pet_id'
- name: pet
in: body
schema:
$ref: '#/definitions/Pet'
responses:
200:
description: Pet updated
201:
description: New pet created
delete:
tags: [Pets]
operationId: app.delete_pet
summary: Remove a pet
parameters:
- $ref: '#/parameters/pet_id'
responses:
204:
description: Pet was deleted
404:
description: Pet does not exist


parameters:
pet_id:
name: pet_id
description: Pet's Unique identifier
in: path
type: string
required: true
pattern: "^[a-zA-Z0-9-]+$"

definitions:
Pet:
type: object
required:
- name
- animal_type
properties:
id:
type: string
description: Unique identifier
example: "123"
readOnly: true
name:
type: string
description: Pet's name
example: "Susie"
minLength: 1
maxLength: 100
animal_type:
type: string
description: Kind of animal
example: "cat"
minLength: 1
created:
type: string
format: date-time
description: Creation time
example: "2015-07-07T15:49:51.230+02:00"
readOnly: true

0 comments on commit 1a167ff

Please sign in to comment.