Graphene-SQLAlchemy:SQLAlchemy 模型的 GraphQL 自动生成方案

Graphene-SQLAlchemy 是一个将 SQLAlchemy 与 Graphene 桥接起来的 Python 库,目前获得 985 Star。它为已有的 SQLAlchemy ORM 模型提供了一条生成 GraphQL schema 的通路。

正文顶部截图

README区域截图

GraphQL 的 schema 定义通常需要为每个数据模型手写对象类型、字段解析器和查询接口。当底层数据层已经是 SQLAlchemy 模型时,这部分工作就变成了重复劳动:数据库列和 GraphQL 字段一一对应,resolver 也只是把查询转发给 ORM。

Graphene-SQLAlchemy 要解决的就是这个问题。它的核心机制是提供一个 SQLAlchemyObjectType 基类,开发者声明一个子类并把 Meta.model 指向现有的 SQLAlchemy 模型,字段映射和查询接口就会自动推导出来。

在实际后端开发中,数据库模型往往已经定义完毕,业务层也在正常运行,此时需要对外暴露数据查询接口。如果团队决定采用 GraphQL,每一个模型都需要手写对应的 schema 定义。Graphene-SQLAlchemy 把这个过程压缩成了配置:指定 model,其余交给库来处理。对于字段数量多、模型关系复杂的数据层,这种映射能节省不少时间。

假设你有一个用户模型:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class UserModel(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    last_name = Column(String)

只需要写一个包装类:

import graphene
from graphene_sqlalchemy import SQLAlchemyObjectType

class User(SQLAlchemyObjectType):
    class Meta:
        model = UserModel

class Query(graphene.ObjectType):
    users = graphene.List(User)

    def resolve_users(self, info):
        query = User.get_query(info)
        return query.all()

schema = graphene.Schema(query=Query)

这段代码完成了从 SQLAlchemy 模型到 GraphQL schema 的映射。name、last_name 等字段的类型和可空性都继承自模型定义,不需要额外声明。

字段控制方面,可以通过 only_fields 指定允许暴露的字段,或者通过 exclude_fields 屏蔽特定列。这种白名单和黑名单机制在数据保护时比较实用。

数据库会话的注入有两种方式。Graphene 会检测 SQLAlchemy 模型上的 query_property,从中获取 session。也可以在执行查询时通过 context 字典手动传入。

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

engine = create_engine('sqlite:///database.sqlite3', convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))
Base.query = db_session.query_property()

查询接口的使用方式与 Graphene 一致:

query = '''
    query {
      users {
        name,
        lastName
      }
    }
'''
result = schema.execute(query, context_value={'session': db_session})

对于需要在多个模型上复用业务逻辑的场景,Graphene-SQLAlchemy 支持抽象基类。在 Meta 中设置 abstract = True,子类会继承父类的自定义 resolver 和过滤逻辑。

这个项目提供了 Flask 和 Nameko 的示例,覆盖了两种常见的 Web 框架集成场景。开发者可以参考这些示例快速搭建自己的服务。

目前项目处于 3.0 beta 阶段,API 可能会有调整。生产环境使用前建议先做充分测试。

安装命令:

pip install --pre "graphene-sqlalchemy"

这个库面向已经使用 SQLAlchemy 管理数据模型的 Python 项目,提供低成本的 GraphQL 接入方案。它把模型到 schema 的映射自动化,减少样板代码,让开发者把注意力放在业务逻辑上。

SQLAlchemy 管理数据模型的 Python 项目,提供低成本的 GraphQL 接入方案。它把模型到 schema 的映射自动化,减少样板代码,让开发者把注意力放在业务逻辑上。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐