# -*- 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)
# -*- 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
# 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