当前位置: 首页 > 工具软件 > flask-graphql > 使用案例 >

python flask grathql

刘德义
2023-12-01

1 安装依赖包

pip install flask flask-graphql flask-migrate sqlalchemy graphene graphene-sqlalchemy psycopg2

2 demo
app.py

# Imports
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import graphene
from graphene_sqlalchemy import SQLAlchemyObjectType, SQLAlchemyConnectionField
from flask_graphql import GraphQLView

# initializing our app
app = Flask(__name__)
app.debug = True

# Configs
# Replace the user, password, hostname and database according to your configuration information
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@localhost:5432/postgres'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 

# Modules
db = SQLAlchemy(app)

# Models
class User(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, index=True)
    email = db.Column(db.String(120), unique=True, nullable=False)
    books = db.relationship('Book', backref='author')

    def __init__(self, username, email):
      self.username = username
      self.email = email

    def __repr__(self):
        return '<User %r>' % self.id

class Book(db.Model):
    __tablename__ = 'books'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(256), index=True, nullable=False)
    description = db.Column(db.Text, nullable=False)
    year = db.Column(db.Integer, nullable=False)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    def __repr__(self):
        return '<Book %r>' % self.title % self.description % self.year % self.author_id

class Author(db.Model):
    __tablename__ = 'authors'

    id = db.Column(db.Integer, primary_key=True)
    Name = db.Column(db.String(256), index=True, nullable=False)

    def __repr__(self):
        return '<Author %r>' % self.id %self.Name


# Schema Objects
class BookObject(SQLAlchemyObjectType):
    class Meta:
        model = Book
        interfaces = (graphene.relay.Node, )

# Schema Objects
class AuthorObject(SQLAlchemyObjectType):
    class Meta:
        model = Author
        interfaces = (graphene.relay.Node, )


class UserObject(SQLAlchemyObjectType):
    class Meta:
        model = User
        interfaces = (graphene.relay.Node, )

class Query(graphene.ObjectType):
    node = graphene.relay.Node.Field()
    all_books = SQLAlchemyConnectionField(BookObject,id=graphene.Int(),description="通过 Id 查询")
    def resolve_all_books(self,info,**args):
        query=BookObject.get_query(info)
        # return Book.query.filter_by(id=args.get("id"))
        return query.filter_by(id=args.get("id"))
    all_users = SQLAlchemyConnectionField(UserObject)
    all_authors=SQLAlchemyConnectionField(AuthorObject)

schema = graphene.Schema(query=Query)

class AddBook(graphene.Mutation):
    class Arguments:
        title = graphene.String(required=True)
        description = graphene.String(required=True) 
        year = graphene.Int(required=True) 
        username = graphene.String(required=True)
    book = graphene.Field(lambda: BookObject)

    def mutate(self, info, title, description, year, username):
        user = User.query.filter_by(username=username).first()
        book = Book(title=title, description=description, year=year)
        if user is not None:
            book.author = user
        db.session.add(book)
        db.session.commit()
        return AddBook(book=book)

class Mutation(graphene.ObjectType):
    add_book = AddBook.Field()
schema = graphene.Schema(query=Query, mutation=Mutation)


# Routes
app.add_url_rule(
    '/graphql-api',
    view_func=GraphQLView.as_view(
        'graphql',
        schema=schema,
        graphiql=True # for having the GraphiQL interface
    )
)

@app.route('/')
def index():
    return 'Welcome to Book Store Api'
if __name__ == '__main__':
     app.run()

adddata.py

from app import db, User, Book
# mike = User(username='mikedean', email='mikedean@gmail.com')
# db.session.add(mike)
# db.session.commit()
flaskbook = Book()
flaskbook.title = "fff"
flaskbook.description = "fff"
flaskbook.year = 2019
flaskbook.author_id = 1
db.session.add(flaskbook)
db.session.commit()

3 查询

{
  allBooks{
    edges{
      node{
        title
        description
        author{
          username
        }
      }
    }
  }
}

4 修改

mutation {
  addBook(
    username:"mikedean",
    title:"Intro to GraphQL",
    description:"Welcome to the course",
    year:2018){
    book{
      title
      description
      author{
        username
      }
    }
  }
}

5 后续详解补充

 类似资料:

相关阅读

相关文章

相关问答