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的根页面:
Person页面:
Car页面:
开发总结
适配中遇到的问题点:
- 报错: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) | 推荐 |
- 点赞
- 收藏
- 关注作者
评论(0)