PyPb系列-pb和python交互支持xp(二)-数据库增删查改CRUD

前置文章

PyPb系列-pb和python交互支持xp(一)-数据库连接icon-default.png?t=M85Bhttps://blog.csdn.net/u010238274/article/details/126914000创建表

# 创建表
SQLCA.execsql("create table testCRUD(a varchar(10) null,b varchar(25))")

创建数据窗口

# 创建报表来实现增删查
ls_error=ref('')
syntax = SQLCA.syntaxfromsql("select a,b from testCRUD",'Style(type=Grid)',ls_error)
if string(ls_error) != '':
    raise Exception("构建动态报表失败:%s" % string(ls_error))
syntax = PyPB_dwsyntaxAddUpdate(syntax,"testCRUD",["a","b"])
ds.create(syntax, ls_error)
if string(ls_error) != '':
    raise Exception("创建动态报表失败:%s" % string(ls_error))
# 查询表数据
ds.settransobject(SQLCA)
ds.retrieve()

插入一行数据

row = ds.insertrow(0)
ds.setitem(row,"a","字段A")
ds.setitem(row,2,"字段B")
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("插入后的数据",epj.tojson(ds,"testCRUD"))

修改数据

ds.setitem(row, "a", "修改")
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("修改a后的数据",epj.tojson(ds,"testCRUD"))

删除数据

ds.deleterow(1)
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("删除后的数据",epj.tojson(ds,"testCRUD"))

删除表

# 删除表
SQLCA.execsql("drop table testCRUD")
print("disconnect",SQLCA.disconnect())

完整的testCRUD.py

# -*- coding: utf-8 -*-
from testSQLCA import *
def PyPB_Uodatastore():
    return pb.Obj("uo_datastore")
def PyPB_dwsyntaxAddUpdate(src,tablename,keyname=[]):
    import re
    r = src
    if len(keyname) >0:
        for k in keyname:
            p = re.compile(r'(column=\(.* name=%s )'%k)
            r = p.sub(r'\1 key=yes', r)

    p = re.compile(r'(column=\(type=\w+\(\d+\))')
    r = p.sub(r'\1 update=yes', r)

    p = re.compile(r'(retrieve="[^"]+")\)')
    r = p.sub(r'\1 update="%s" updatewhere=0 updatekeyinplace=no)'% tablename, r)
    return r
def ref(obj):
    return pb.Obj().ref(obj)
def string(obj):
    return pb.Obj().string(obj)
def PyPB_dwUpdate(ds,SQLCA, withcommit=False):
    r = ds.update()
    if r != 1:
        SQLCA.rollback()
        return ds.is_error
    if withcommit :SQLCA.commit()
    return ''
ds = PyPB_Uodatastore()

# 创建表
SQLCA.execsql("create table testCRUD(a varchar(10) null,b varchar(25))")
# 创建报表来实现增删查
ls_error=ref('')
syntax = SQLCA.syntaxfromsql("select a,b from testCRUD",'Style(type=Grid)',ls_error)
if string(ls_error) != '':
    raise Exception("构建动态报表失败:%s" % string(ls_error))
syntax = PyPB_dwsyntaxAddUpdate(syntax,"testCRUD",["a","b"])
ds.create(syntax, ls_error)
if string(ls_error) != '':
    raise Exception("创建动态报表失败:%s" % string(ls_error))
# 查询表数据
ds.settransobject(SQLCA)
ds.retrieve()
# 插入一行数据
row = ds.insertrow(0)
ds.setitem(row,"a","字段A")
ds.setitem(row,2,"字段B")
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("插入后的数据",epj.tojson(ds,"testCRUD"))
# 修改a字段的值
ds.setitem(row, "a", "修改")
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("修改a后的数据",epj.tojson(ds,"testCRUD"))
# 删除
ds.deleterow(1)
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("删除后的数据",epj.tojson(ds,"testCRUD"))

# 删除表
SQLCA.execsql("drop table testCRUD")
print("disconnect",SQLCA.disconnect())

实现细节

1 SQLCA.syntaxfromsql构建的报表默认没有update属性需要转换一下

column=(type=char(10) updatewhereclause = yes name=a  dbname="testCRUD.a")

通过正则表达式替换为

column=(type=char(10) update=yes updatewhereclause=yes key=yes name=a dbname="testCRUD.a" )

这里注意一点 如果没有设置任何一个key=yes 报表update的时候会导致程序崩溃

2 Python中实现pb的ref参数

// 一般的变量引用方式
ot_build_simple_refarg(_obThis, rt, data, 
    ob_get_group_id(_obThis, getAppGroup()));
ob_set_data_type(rt, ob_get_data_type(data));
// 如果是引用对象中的某个字段
ob_instance_fldupdate_refpkt(_obThis, pd2, obj2, pDataInfo->sym_id);
// 如果是引用数组中的某一个元素,需要用ob_array_group_id
POB_DATA	_TempRef;
_TempRef = ot_array_index(_obThis, _arrayTemp2, _ulongTemp3);
ot_build_simple_refarg(_obThis, _obdataArray, _TempRef
    , ob_array_group_id(_obThis, _arrayTemp2));
ob_set_data_type(_obdataArray, ob_get_data_type(_TempRef));

3 数据库commit,rollback,connect,disconnect操作

if (strcmp(opt,"commit")==0) {
	rtdb_commit(_obThis, rinst(sqlca));
}
else if (strcmp(opt, "rollback") == 0) {
	rtdb_rollback(_obThis, rinst(sqlca));
}
else if (strcmp(opt, "connect") == 0) {
	rtdb_start(_obThis, rinst(sqlca));
}
else if (strcmp(opt, "disconnect") == 0) {
	rtdb_stop(_obThis, rinst(sqlca));
}

python中直接SQLCA.commit() SQLCA.rollback() SQLCA.connect() SQLCA.disconenct()即可

依赖文件目录

easypj.dll、Libjcc.dll、ntwdblib.dll、python.zip、testCRUD.py

pb8或者pb9自行选择

pbweb80.exe、pbvm80.dll、pbmss80.dll、pbdwe80.dll
pbweb90.exe、pbvm90.dll、pbmss90.dll、pbdwe90.dll
直接测试testCRUD.py代码的cmd命令

pbweb80.exe -c "import testCRUD"

输出结果

插入后的数据 [{"a":"字段A","b":"字段B"}]
修改a后的数据 [{"a":"修改","b":"字段B"}]
删除后的数据 [{}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值