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

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

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

开发过程

pony适配过程

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

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

3、安装pony所需的依赖仓库

pip install psycopg2-binary

4、使用setup.py来注册pony到python的site-packages包里

python setup.py develop 

注意此命令在pony的根目录执行,即setup.py的同级目录

5、购买GaussDB数据库

6、编写pony脚本(根据官网的Demo,https://docs.ponyorm.org/firststeps.html#creating-the-database-object,连接GaussDB,进行CRUD操作

from pony.orm import Database, Required, Set, db_session, select, set_sql_debug
import psycopg2

# 配置 Pony 数据库连接
db = Database()

# 查看sql命令
set_sql_debug(True)

# 设置 PostgreSQL 数据库连接
db.bind(provider='postgres', user='YourUserName', password='YourPassword',
        host='YourIP', port='YourPort', database='YourDBName')


# 定义实体类
class Person(db.Entity):
    name = Required(str)
    age = Required(int)
    cars = Set('Car')


class Car(db.Entity):
        make = Required(str)
        model = Required(str)
        owner_id = Required(Person)


# 生成数据库映射
db.generate_mapping(create_tables=True)

# 数据库操作演示
@db_session
def crud_operations():
    # 创建记录
    # p1 = Person(name='John', age=20)
    # p2 = Person(name='Mary', age=22)
    # p3 = Person(name='Bob', age=30)
    # c1 = Car(make='Toyota', model='Prius', owner_id=p2)
    # c2 = Car(make='Ford', model='Explorer', owner_id=p3)

    # 查询记录
    # persons = select(p for p in Person if p.age > 20)[:]
    # print("Persons older than 20:")
    # for person in persons:
    #     print(f"{person.name}, {person.age}")

    print("----------------- dividing line -----------------")
    
    # 获取Mary对象
    mary = Person.get(name='Mary')
    
    # 更新记录
    # mary.age += 1

    # 删除记录
    # mary.delete()
    
    # 查询外键信息
    cars = mary.cars
    for car in cars:
        print("Mary's cars: ", car.make, car.model, car.owner_id.name)

    # 查看所有记录
    all_persons = Person.select()[:]
    print("All persons:")
    for person in all_persons:
        print(f"{person.name}, {person.age}")


# 运行 CRUD 操作
if __name__ == "__main__":
    crud_operations()

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

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


Django提供RESTful API开发过程

根据项目验收要求,对在GaussDB上新建的数据,提供RESTful API的要求,采用Django+djangorestframework+GaussDB的技术栈实现

1、新建虚拟环境,如上

2、安装Django所需的依赖库

pip install django==3.2.25

pip install djangorestframework==3.12.0

pip install psycopg2-binary

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

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'XXX',    # 数据库名称
        'USER': 'XXX',    # 数据库用户
        'PASSWORD': 'XXX',  # 用户密码
        'HOST': 'XXX',   # GaussDB 主机
        'PORT': 'XXX',        # GaussDB 端口
    }
}

4、开发好urls.py、views.py、serializers.py、models.py的代码,就可以启动服务了

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

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

API的根页面:

pony-api.png

Person页面:

pony-api-person.png

Car页面:

pony-api-car.png

开发总结

适配中遇到的问题点:

  • 报错:Illegal instruction (core dumped)
    • 问题描述:使用GaussDB官方提供的驱动包,在ECS上选择的是 Euler2.9_arm_64 目录下的psycopg2包,根据文档安装psycopg2包后,使用`python3 -c 'import psycopg2; print(psycopg2.__version__)'`可以正常显示版本信息,但是,在使用脚本连接GaussDB时,就报错:Illegal instruction (core dumped)。
    • 分析:根据报错信息查询,网上更多的是说驱动包与系统不兼容的问题,可能需要驱动包发布方验证,提供支持或者安装psycopg2包与ECS系统不对应。
    • 解决方案:
      • 使用pip提供的psycopg2包,可以连接GaussDB,提供驱动服务。这个方案虽然可以正常使用,但是需要修改GaussDB的password_encryption_type为1,有降低password安全性的风险。因此,不建议这样适配。
      • 因我的ECS是HuaweiCloudEulerOS 5.10.0-182.0.0.95.r1941_123.hce2.aarch64系统,在GaussDB提供的驱动包中,要使用 Hce2_arm_64 目录下psycopg2包,经测试不用修改GaussDB的password_encryption_type就可以直接使用GaussDB,满足需求。(确认之前是因为选错目录导致)
  • 报错:DISCARD statement is not yet supported
    • 原因:因为我们使用的是postgresDB的方式,pony中会对其执行`cursor.execute('DISCARD ALL')`——清理会话中的临时资源。这个命令对于GaussDB而言,并不支持。所以,会报错。
    • 解决方案:当pony使用GaussDB时,注释掉 pony/orm/dbproviders/postgres.py 的183行代码`cursor.execute('DISCARD ALL')`。
    • 风险:经测可以正常使用GaussDB,因测试demo没有太过复杂的场景,担心当业务复杂度上去后,可能会出现资源浪费的情况。

验收材料

交付件清单

  • (1) 博客的地址: 
  • (2) Demo仓库地址:

验收细则

评分说明

是否为验收必选项

结果(通过/不通过)

开发者举证

功能开发:完成与华为三大根技术生态(鲲鹏云、昇腾云、鸿蒙)适配的功能开发

完成GaussDB数据库适配功能验证。

 

参考资源清单和测试结果。

代码质量:适配华为三大根技术生态的代码质量经过工具检测达标

不涉及

 

 

提供相关文档,比如部署文档、使用文档、配置文档等

不涉及

 

 

合入到开源项目主仓:代码推送上游社区

不涉及

 

 

Deomo设计&开发:完成功能演示Demo的开发

不涉及

 

 

Demo部署&验证:完成功能演示DEMO基于华为云鲲鹏环境的部署和功能验证

提供DEMO部署验证结果的关键截图进行举证。提供DEMO运行环境和资源的规格清单。

 

参考资源清单和测试结果。

发布博客:发布博客介绍适配心得。

提供博客的地址。

 

参考(1

制作单机版无高危开源镜像。

上架云商店。

 

 

单机版镜像上架时支持模板部署。

 

 

 

制作集群版无高危开源镜像

上架云商店。

 

 

集群版镜像上架时支持模板部署

 

 


资源清单

产品名称 产品类型 数据库引擎版本 内核引擎版本 实例类型 部署形态 备注
云数据库 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个月内不可修改。