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创建表和数据:
>>> 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示例的更多相关文章
- flask SQLAlchemy中一对多的关系实现
SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...
- flask, SQLAlchemy, sqlite3 实现 RESTful API 的 todo list, 同时支持form操作
flask, SQLAlchemy, sqlite3 实现 RESTful API, 同时支持form操作. 前端与后台的交互都采用json数据格式,原生javascript实现的ajax.其技术要点 ...
- 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 ...
- Flask – SQLAlchemy成员增加
目录 简介 结构 展示 技术 运行 代码 创建数据库表单 views视图 home主页 添加成员addnew.html 展示页show_all 简介 结构 $ tree -I "__pyca ...
- flask SQLALchemy外键及约束
from flask import Flask,session from flask_sqlalchemy import SQLAlchemy import config app = Flask(__ ...
- Flask SQLAlchemy & model
Flask-SQLAlchemy Flask-SQLAlchemy库让flask更方便的使用SQLALchemy,是一个强大的关系形数据库框架,既可以使用orm方式操作数据库,也可以使用原始的SQL命 ...
- Docker示例
运行一个Hello world zane@zane-V:~$ docker run ubuntu /bin/echo 'Hello world' Unable to find image 'ubu ...
- Flask+SQLAlchemy+alembic+Flask-RESTful使用
前言 其实准备把这篇删掉,先写Flask-restful相关的,后来想想大体框架还是先写出来,这两天踩了很多坑,有的谷歌也没有答案.一直摸索也总算是开始了. 正文 SQLAlchemy/alembic ...
- python3 + flask + sqlalchemy +orm(3):多对多关系
一篇文章有多个tag,一个tag也可以属于多篇文章,文章和tag存在多对多关系 config.py DEBUG = True #dialect+driver://root:1q2w3e4r5t@127 ...
随机推荐
- [RN] 阿里 ant-design 菜单比较丰富 https://github.com/ant-design/ant-design-mobile
阿里 ant-design 菜单比较丰富 https://github.com/ant-design/ant-design-mobile 天和风雨顺 地和五谷丰 人和事业旺 家和万事兴
- django -- ORM查询
前戏 在我们之前操作ORM中,你也许是启动Django项目,通过地址访问固定的函数,或者在pycharm里的python console里执行,第一种比较麻烦,而且每次都要启动项目,写路由,第二种虽然 ...
- 洛谷 CF399B【Red and Blue Balls】题解
n年没有更博客:我总结出了规律,当学的东西很难得时候都去学习,没有时间写博客,只有 内容对于我这种蒟蒻友好,又让我非常闲的慌时才写博客,这种博客以后也没有价值(也有些是做完一道题有成就感写的) 最近内 ...
- 获取当前页面url指定参数值
function getParam(paramName) { paramValue = "", isFound = !1; if (this.location.search.ind ...
- 关于getClass(),Object.class,getClassLoader的理解
1.对Class类的理解:Class类包含了类的信息,如构造方法.方法.属性,可用于反射.以下是所有方法 2.获取Class类对象的几种方法: Test test = new Test(); (1). ...
- python3.5以上版本,typing模块提高代码健壮性
一 前言 Python是一门弱类型的语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数, ...
- sql server数据表大小初始化
sql server表在存储大数据和处理大数据表时,经常会遇到表空间越来越大,有时候会超出应该占有空间大小很多,此时如果表数据是压缩存储的,那么重新执行一下压缩脚本,数据的大小会重新初始化,然后再使用 ...
- python面试题300多题
第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C#.C++等其他语言的对比? 简述解释型和编译型编程语言? P ...
- C#实现ActiveMQ消息队列
本文使用C#实现ActiveMQ消息队列功能. 一.首先需要导入两个包,分别是:Apache.NMS 和 Apache.NMS.ActiveMQ 二.创建Winform程序实现生产者功能. 三.Pro ...
- json对象与string相互转换教程
一.说明 1.1 背景说明 json对象与string相互转换,这东西想写了很多次,但总觉得网上教程比较成熟,所以之前每次都放弃了.但今天又被string转json对象折腾了半天,实在受不了,所以还是 ...