SQLAlchemy适配GaussDB开源验证任务心得

举报
西装暴徒_Michael 发表于 2024/11/29 15:08:11 2024/11/29
【摘要】 这个任务的主要工作是完成 SQLAlchemy 连接 GaussDB 的验证工作。

第一步先看下任务计划书 https://bbs.huaweicloud.cn/blogs/437780 ,这个任务的主要工作是完成 SQLAlchemy 连接 GaussDB 的验证工作。主要是需要花时间熟悉 SQLAlchemy 的底层代码逻辑和基本使用方法,下面介绍下适配过程中的一些关键步骤。

开发过程

1、为了避免开发环境混乱无序,建议使用虚拟环境开发:python -m venv yourVenvName

2、fork代码 https://github.com/sqlalchemy/sqlalchemy 到个人仓库,然后再进入虚拟环境,clone代码。

3、安装 SQLAlchemy 适配 GaussDB 所需的驱动,使用GaussDB官网提供的驱动

4、使用 pyproject.toml 来注册 sqlalchemy 到python的site-packages包里

pip install -e .

注意此命令在 sqlalchemy 的根目录执行,即 pyproject.toml 的同级目录

5、购买GaussDB数据库

6、安装Django所需的依赖库

pip install django==3.2.25

7、设置Django下的settings.py里的database的配置

SQLALCHEMY_DATABASES = {
    'NAME': 'XXX',    # 数据库名称
    'USER': 'XXX',    # 数据库用户
    'PASSWORD': 'XXX',  # 用户密码
    'HOST': 'XXX',   # GaussDB 主机
    'PORT': 'XXX',   # GaussDB 端口
}

8、根据官网的Demo(https://docs.sqlalchemy.org/en/20/orm/quickstart.html),开发好urls.py、views.py、models.py的代码(详见,请移步:https://gitcode.com/michael_chen/sqlalchemyDemoPython/overview),就可以启动服务了

9、启动服务,python manage.py runserver 0.0.0.0:yourPort

10、验证数据,经过测试,可以通过API对GaussDB的数据CRUD操作。

User表的数据:

get-all:

sqlalchemy-user-get-all.png

get-one:

sqlalchemy-user-get-one.png

post:

sqlalchemy-user-post.png

put:

sqlalchemy-user-put.png

delete:

sqlalchemy-user-delete.png

Address表的数据:

get-all:

sqlalchemy-address-get-all.png

get-one:

sqlalchemy-address-get-one.png

post:

sqlalchemy-address-post.png

put:

sqlalchemy-address-put.png

delete:

sqlalchemy-address-delete.png

11、登录GaussDB提供的管理平台查看是否创建数据库,以及创建的数据表数据是否符合预期,经检查符合预期

sqlalchemy-GaussDB.png

至此,经验收,SQLAlchemy 所生成的数据符合预期,SQLAlchemy 适配GaussDB,使用GaussDB提供的psycopg2驱动,可以完成基本使用,后续有因方言等问题,持续更新。

开发总结

适配中遇到的问题点:

  • 报错:Could not determine version from string 'gaussdb (GaussDB Kernel 505.2.0 build e3976aad) compiled at 2024-09-20 00:15:18 commit 9967 last mr 19883 release'
    • 原因:PostgresDB和GaussDB对于SQL——`select pg_catalog.version()`的返回值(数据库版本信息字符串)不一样,导致`re.match()`在解析GaussDB的版本信息时,未能正确解析出来,从而导致主动 raise异常。
    • 解决方案:在`sqlalchemy/lib/sqlalchemy/dialects/postgresql/base.py`的第3383行,优化正则匹配规则,使之能兼容GaussDB的版本信息
m = re.match(
	r"(?:(?:PostgreSQL|EnterpriseDB)\s+(\d+)\.?(\d+)?(?:\.(\d+))?(?:\.\d+)?(?:devel|beta)?)"  # 匹配 PostgreSQL 或 EnterpriseDB
	r"|"
	r"(?:gaussdb\s+\(GaussDB Kernel\s+(\d+)\.(\d+)\.(\d+))",  # 匹配 GaussDB 格式
	v,
)


验收材料

交付件清单

资源清单

产品名称 产品类型 数据库引擎版本 内核引擎版本 实例类型 部署形态 备注
云数据库 GaussDB 基础版 V2.0-8.* 505.2.* 集中式 1主2备 推荐


产品名称 CPU架构 实例类型 公共镜像 镜像版本 备注
弹性云服务器 鲲鹏计算 鲲鹏通用计算增强型 Huawei Cloud EulerOS Huawei Cloud EulerOS 2.0 标准版 64位 ARM版(10GiB) 推荐



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。