Add sqlalchemy_example.py for sqlalchemy integration example
This commit is contained in:
parent
65950250d9
commit
0c05de33a0
89
examples/sqlalchemy_example.py
Normal file
89
examples/sqlalchemy_example.py
Normal file
|
@ -0,0 +1,89 @@
|
|||
""" SQLAlchemy integration demo
|
||||
Use sqlalchemy to connect a in-memory sqlite database
|
||||
Defined a table User contains id, name, fullname, password as its columns
|
||||
Provider RESTFul service
|
||||
GET /users to get all of users in User table
|
||||
POST /user to create user
|
||||
GET /users/{id} to get user with specific id
|
||||
|
||||
Could test it with after running the sanic server:
|
||||
curl http://localhost:8000/users
|
||||
curl http://localhost:8000/users/1
|
||||
curl http://localhost:8000/users/4
|
||||
curl http://localhost:8000/user --data '{"name": "ed", "password":"f8s7ccs","fullname":"Ed Jones"}'
|
||||
"""
|
||||
|
||||
from sanic import Sanic
|
||||
from sanic.response import json
|
||||
from sanic.exceptions import NotFound
|
||||
from sqlalchemy import (
|
||||
Column, String, Integer, Sequence,
|
||||
create_engine
|
||||
)
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
|
||||
class User(Base):
|
||||
__tablename__ = "users"
|
||||
id = Column(Integer, Sequence("user_id_seq"), primary_key=True)
|
||||
name = Column(String(50))
|
||||
fullname = Column(String(50))
|
||||
password = Column(String(12))
|
||||
|
||||
def serialize(self):
|
||||
return {
|
||||
"id": self.id,
|
||||
"name": self.name,
|
||||
"fullname": self.fullname,
|
||||
"password": self.password,
|
||||
}
|
||||
|
||||
engine = create_engine("sqlite://")
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
session = sessionmaker()
|
||||
session.configure(bind=engine)
|
||||
|
||||
s = session()
|
||||
s.add_all([
|
||||
User(name="wendy", fullname="Wendy Williams", password="foobar"),
|
||||
User(name="mary", fullname="Mary Contrary", password="xxg527"),
|
||||
User(name="fred", fullname="Fred Flinstone", password="blah")])
|
||||
s.commit()
|
||||
|
||||
app = Sanic(__name__)
|
||||
|
||||
|
||||
@app.route("/users", methods=["GET"])
|
||||
async def all_users(request):
|
||||
users = list(map(lambda u: u.serialize(), s.query(User).all()))
|
||||
return json(users)
|
||||
|
||||
|
||||
@app.route("/user", methods=["POST"])
|
||||
async def new_user(request):
|
||||
try:
|
||||
s.add(User(**request.json))
|
||||
return json({"success": True})
|
||||
except Exception as e:
|
||||
return json({"success": False})
|
||||
|
||||
|
||||
@app.route("/users/<user_id:int>", methods=["GET"])
|
||||
async def user(request, user_id):
|
||||
try:
|
||||
return json(s.query(User).filter_by(id=user_id)[0].serialize())
|
||||
except IndexError:
|
||||
raise NotFound("no user found with id: " + str(user_id))
|
||||
|
||||
|
||||
@app.exception(NotFound)
|
||||
async def not_found(request, exception):
|
||||
return json({"type": type(exception).__name__, "message": str(exception)})
|
||||
|
||||
|
||||
app.run(host="0.0.0.0", port=8000)
|
Loading…
Reference in New Issue
Block a user