Flask+SQLAlchemy+graphene+docker示例

搭建一个利用docker启动服务的Flask的小demo

定义数据库

# -*- coding: utf-8 -*-


from sqlalchemy import *
from sqlalchemy.orm import (
    scoped_session, sessionmaker, relationship, backref
)
from sqlalchemy.ext.declarative import declarative_base


# mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
engine = create_engine("mysql+mysqlconnector://root:@localhost:3306/demo", convert_unicode=True)
session = scoped_session(sessionmaker(
    autocommit=False, autoflush=False, bind=engine
))


Base = declarative_base()
Base.query = session.query_property()


class Department(Base):

    __tablename__ = "department"

    id = Column(Integer, primary_key=True)
    name = Column(String(50))


class Employee(Base):

    __tablename__ = "employee"

    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    hired_on = Column(DateTime, default=func.now())
    department_id = Column(Integer, ForeignKey("department.id"))
    department = relationship(
        Department,
        backref=backref(
            "employee",
            uselist=True,
            cascade="delete,all"
        )
    )

利用SQLAlchemy定义了两个表,其中Department经过relationship能够关联多个Employee,而后经过python console建立表和数据:node

>>> from models import *
>>>
>>>
>>> Base.metadata.create_all(bind=engine)
>>>
>>>
>>> engineering = Department(name="Engineering")
>>> session.add(engineering)
>>> hr = Department(name="Human")
>>> session.add(hr)
>>>
>>>
>>> peter = Employee(name="Peter", department=engine)
engine              engine_from_config( engineering
>>> peter = Employee(name="Peter", department=engineering)
>>>
>>> session.add(peter)
>>>
>>>
>>>
>>> roy = Employee(name="Roy", department=engineering)
>>>
>>> session.add(roy)
>>>
>>>
>>> tracy = Employee(name="Tracy", department=hr)
>>>
>>> session.add(tracy)

定义graphql的的Query

# -*- coding: utf-8 -*-


from graphene import relay, ObjectType, Schema
from graphene_sqlalchemy import (
    SQLAlchemyConnectionField, SQLAlchemyObjectType
)

from models import (
    Department as DepartmentModel,
    Employee as EmployeeModel
)


class Department(SQLAlchemyObjectType):

    class Meta:
        model = DepartmentModel
        interfaces = (relay.Node, )


class DepartmentConnections(relay.Connection):

    class Meta:
        node = Department


class Employee(SQLAlchemyObjectType):

    class Meta:
        model = EmployeeModel
        interfaces = (relay.Node, )


class EmployeeConnections(relay.Connection):

    class Meta:
        node = Employee


class Query(ObjectType):

    node = relay.Node.Field()
    all_employees = SQLAlchemyConnectionField(EmployeeConnections)
    all_departments = SQLAlchemyConnectionField(DepartmentConnections, sort=None)


schema = Schema(query=Query)

首先经过继承SQLAlchemyObjectType类来定义新的查询的类,而后经过relay.Connection来链接所定义的查询类,而且在Query中进行申明,其中我在Connection后面加了一个s是由于在github上看issue的时候发如今构造类的过程当中会出现重名的状况致使申明Query的时候会报错,因此加一个s用来避免这个错误。
其中有关graphene的部分我本身也还不是特别熟悉,因此只能是大概说一下本身的思路,若是有错误的地方会在后续中及时的进行修改,避免误人子弟。
最终达到的效果是指定来一个schema,其中包含了我所定义的查询。python

本地启动

# -*- coding: utf-8 -*-


from flask import Flask
from flask_graphql import GraphQLView

from models import session
from schema import schema


app = Flask(__name__)
app.debug = True


app.add_url_rule(
    "/graphql",
    view_func=GraphQLView.as_view(
        "graphql",
        schema=schema,
        graphiql=True
    )
)


@app.teardown_appcontext
def shutdown_session(exception=None):
    session.remove()


if __name__ == "__main__":
    app.run()

经过Flask的add_url_rule将graph的视图定义成经过路由可访问,而后启动就能够进行访问了,点击http://127.0.0.1:5000/graphql就能够本地访问了。mysql

经过docker启动

  • 创建镜像
# run.docker
FROM python:3.6

COPY . /app

WORKDIR /app

RUN pip install -r requirements.txt

CMD ["python", "app.py"]

这个是个人Dockerfile,经过Dockerfile,我指定了这个镜像是来自于python:3.6这个镜像,而后把我当前目录下的全部内容经过COPY . /app复制到了docker镜像中的/app目录下,接着我指定了WORKDIR/app,这样我就能够在/app目录下进行操做了,首先是安装全部须要的依赖包,由于我是从python3.6拉的镜像,因此能够不用再去安装pip,直接就能够安装了,若是是其余镜像可能还要同构apt去安装pip再进行依赖包的安装,最后就是用CMD来运行文件了。git

docker build -t flask_sqlalchemy:core -f run.docker .
# 其中的.是为了指明上下文路径,其实Dockerfile中的命令并非对本地文件进行操做,而是经过指定上下文路径将这些文件传到docker搭建镜像的环境中再进行操做。

镜像创建以后就能够run了github

docker run -d -p 5000:5000 --name flask-core flask_sqlalchemy:lastest

而后就启动了。


sql

相关文章
相关标签/搜索