搭建一个利用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创建表和数据:

>>> 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,其中包含了我所定义的查询。

本地启动

# -*- 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就可以本地访问了。

通过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来运行文件了。

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

镜像建立之后就可以run了

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

然后就启动了。





Flask+SQLAlchemy+graphene+docker示例的更多相关文章

  1. flask SQLAlchemy中一对多的关系实现

    SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...

  2. flask, SQLAlchemy, sqlite3 实现 RESTful API 的 todo list, 同时支持form操作

    flask, SQLAlchemy, sqlite3 实现 RESTful API, 同时支持form操作. 前端与后台的交互都采用json数据格式,原生javascript实现的ajax.其技术要点 ...

  3. flask建表遇到的错误: flask,sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1071, 'Specified key was too long; max key length is 767 bytes')

    error:flask,sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1071, 'Specifie ...

  4. Flask – SQLAlchemy成员增加

    目录 简介 结构 展示 技术 运行 代码 创建数据库表单 views视图 home主页 添加成员addnew.html 展示页show_all 简介 结构 $ tree -I "__pyca ...

  5. flask SQLALchemy外键及约束

    from flask import Flask,session from flask_sqlalchemy import SQLAlchemy import config app = Flask(__ ...

  6. Flask SQLAlchemy & model

    Flask-SQLAlchemy Flask-SQLAlchemy库让flask更方便的使用SQLALchemy,是一个强大的关系形数据库框架,既可以使用orm方式操作数据库,也可以使用原始的SQL命 ...

  7. Docker示例

    运行一个Hello world   zane@zane-V:~$ docker run ubuntu /bin/echo 'Hello world' Unable to find image 'ubu ...

  8. Flask+SQLAlchemy+alembic+Flask-RESTful使用

    前言 其实准备把这篇删掉,先写Flask-restful相关的,后来想想大体框架还是先写出来,这两天踩了很多坑,有的谷歌也没有答案.一直摸索也总算是开始了. 正文 SQLAlchemy/alembic ...

  9. python3 + flask + sqlalchemy +orm(3):多对多关系

    一篇文章有多个tag,一个tag也可以属于多篇文章,文章和tag存在多对多关系 config.py DEBUG = True #dialect+driver://root:1q2w3e4r5t@127 ...

随机推荐

  1. 直接插入排序与缩小增量插入排序(希尔排序ShellSort)

    直接插入排序 要理解shell排序,首先要把直接插入排序的基础打扎实. 学习资料:白话经典算法系列之二 直接插入排序的三种实现.直接插入排序 根据我的思路,直接插入排序设置3重循环. 循环1:对 i= ...

  2. django数据处理

    目录 django积累 连接数据库: 模板 后台管理 功能扩展: 日志打印: django积累 连接数据库: 连接数据库 : 1.创建数据库 create database oa default ch ...

  3. SpringData JPA一对多多对一多对多关联

    一.一对多.多对一 1.Country实体类 2.City实体类 3.CountryDao层 4.CityDao层 5.Controller package com.zn.controller; im ...

  4. R语言中的特殊值 NA NULL NaN Inf

    这几个都是R语言中的特殊值,都是R的保留字, NA:Not available  表示缺失值   用 is.na() 来判断是否为缺失值 NULL:表示空值,即没有内容  用 is.null() 来判 ...

  5. 我对网络IO的理解

    Unix/Linux系统下IO主要分为磁盘IO,网络IO,我今天主要说一下对网络IO的理解,网络IO主要是socket套接字的读(read).写(write),socket在Linux系统被抽象为流( ...

  6. Golang(六)time 包的用法整理

    1. 常用结构体 Duration:type Duration int64,时间长度,对应单位包括 Nanosecond(纳秒).Microsecond(微妙).Millisecond(毫秒).Sec ...

  7. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time

    Tomcat在启动是提示: INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least on ...

  8. 关于 Object.defineProperty()

    通常,定义或者修改一个JS对象,有以下方式: // 1. 字面量 let obj = { name: 'cedric', age: 18 } // 2. new Object() let obj = ...

  9. 哈夫曼树的构建(C语言)

    哈夫曼树的构建(C语言) 算法思路: 主要包括两部分算法,一个是在数组中找到权值最小.且无父结点两个结点位置,因为只有无父结点才能继续组成树: ​ 另一个就是根据这两个结点来修改相关结点值. 结构定义 ...

  10. 简易版php文件上传_超详细详解

    1.php简化版的图片上传(没有各种验证) 1234 <form action="" enctype="multipart/form-data" meth ...