当前位置:   article > 正文

达梦数据库DM_fail to cast string

fail to cast string

下载

点击DM8下载,可以选择操作系统

安装

Windows安装

MySql迁移到DM

可以使用下面工具直接由mysql到达梦进行数据转移
如果提前创建好达梦数据库,在进行数据迁移时报错数据表已经存在可以直接单选重新执行数据迁移。

从 MySQL 迁移到 DM

迁移过程中出现自增字段不能赋值问题

这时候上网搜索提示开启字段insert为on。实际上有可能数据超出表字段长度,也会报这个错误。看一下导进去的数据。

SET IDENTITY_INSERT "用户名"."表名" ON;
  • 1

python连接DM

python连接DM

dmPython安装问题

  • 需要安装达梦数据库才可以安装dmPython
  • 也可以复制达梦数据库的三个文件到Linux下:drivers、bin、include。(要注意cpu架构和系统与达梦这三个文件匹配问题)
  • 然后vim .bashrc文件,加入环境变量
export PATH="/root/dmdba_arm/bin:$PATH"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/root/dmdba_arm/bin"
export DM_HOME="/root/dmdba_arm"
  • 1
  • 2
  • 3
  • 然后source .bashrc
  • cd /root/dmdba_arm/drivers/python/dmPython
  • python setup.py install即可安装完成dmPython

dmPython使用

  • 配置

host
port
user
password

  • dmPython.connect

conn = dmPython.connect(配置)
cursor = conn.cursor()
查询返回的数据:[(), (), ()]

  • 数据库连接池

pip install DBUtils==1.3
from DBUtils.PooledDB import PooledDB
self.pool = PooledDB(creator=dmPython, mincached=50, maxcached=100, 配置)
conn = self.pool.connection()
cursor = conn.cursor()
查询返回的数据:[(), (), ()]
防sql注入,select_args()方法中sql语句占位符使用问号而不是%。

  • 查询数据转换为[{}, {}

keys = [x[0].lower() for x in cursor.description]
result = [{x: y for x, y in zip(keys, v)} for i, v in enumerate(result)]

  • django连接

DATABASES = {
‘default’: {
‘ENGINE’: ‘django_dmPython’,
‘USER’: cfg.get(‘company_db’, ‘user’),
‘PASSWORD’: cfg.get(‘company_db’, ‘password’),
‘HOST’: cfg.get(‘company_db’, ‘host’),
‘PORT’: str(cfg.get(‘company_db’, ‘port’)),
}
}

  • django项目部署中标麒麟服务器,新增数据报错问题。

dmPython.DatabaseError: [CODE:-2111]Error in line: 1
Invalid column name [AAAAAAAAAAAAAAAAAE]

问题出现在返回新增结果时候。是django_dmPython中语法错误。
/lib/python3.8/site-packages/django_dmPython/operations.py

query = 'select %s from %s where rowid = %s' %(self.quote_name(pk_name), self.quote_name(table_name), cursor.lastrowid)
改为
query = """select %s from %s where rowid = '%s'""" %(self.quote_name(pk_name), self.quote_name(table_name), cursor.lastrowid)
  • 1
  • 2
  • 3
  • django ORM save()报错直接捕获
def dm_save_error_deal(orm_object):
    try:
        orm_object.save
    except django.db.utils.DatabaseError as e:
        if "Fail to cast string" in str(e):
            pass
        else:
            raise e
    except Exception as e:
        raise e
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

达梦sql

数据库表操作语句

  • 建表语句
# 达梦数据库低版本没有json,tinyint
create table 表明
(
	id  bigint  primary key IDENTITY(1,1),  # 自增
	create_time timestamp default CURRENT_TIMESTAMP,  # 时间类型没有datetime
	description text null,
)
# 达梦数据库需要手动一条一条加conmment
comment on table 表名 is 'xxxx';
comment on column 表明.字段名 is 'xxx';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 创建索引
create index 索引名 on 表名 (字段名);
  • 1
  • 修改表语句
alter table 表名 add 字段名 字段类型;  # 增加字段
alter table 表名 modify 字段名 字段类型;  # 修改表字段类型
alter table 表名 rename column column1 to column2
alter table 表名 drop column column1
  • 1
  • 2
  • 3
  • 4
  • 删表、清空表
drop table 表名;
truncate table 表名;
  • 1
  • 2
  • 查看版本
select *, id_code from v$version;  # 查看达梦版本
sp_tabledef(‘模式名’,‘表名’);  #查看表定义
  • 1
  • 2
  • 查看索引
SELECT TABLE_OWNER, TABLE_NAME, COLUMN_NAME ,INDEX_NAME from DBA_IND_COLUMNS  WHERE table_name ='表名';
  • 1
  • 创建索引
create index 模式名.索引名 on 模式名.表名 (索引列);
# 联合唯一索引
create unique index 模式名.索引名 on 模式名.表名 (索引列, 索引列);
# 删除索引
drop index index1;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 创建索引
drop index 模式名.索引;  # 索引名唯一
  • 1
  • 插入语句
insert into table (column1, column2) values (value1, value2)
# 不支持下面语句
insert into table set column1=value1, column2=value2
  • 1
  • 2
  • 3
  • 查询语句
# 没有date()方法,需要使用cast
cast(column1 as DATE)

# 在使用group by时不能group by 别名,或者使用子查询。例如:
select cast(create_time as DATE) date_time, freq from test group by cast(create_time as DATE)

# 不支持sum()、count()等函数内写条件式,需要结合case when...then...else...end
select sum(case when column1 in ('', '') then 1 else 0 end) from table

# 达梦数据库中整数/整数会保留整数,所以需要在分母使用cast转为float或者decimal,结果最好也控制一下小数点位数
select cast((sum(case when column1 in ('', '') then 1 else 0 end)/ cast(count(1) as decimal)) as decimal(10,5)) from table

# 达梦数据库中除法当分母为0时会报错,所以也需要做一个判断
select case when count(1) != 0 then cast((sum(case when column1 in ('', '') then 1 else 0 end)/ cast(count(1) as decimal)) as decimal(10,5)) else 0 end from table

# 标准差
stddev_smap()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

遇到的问题

达梦数据库删除表索引问题

如何将达梦数据库表的非主键唯一索引改成普通索引?如果不能改的话,怎么删呢?删的时候报错:没有删除表[XXX]上索引的权限

  • 非主键唯一索引属于系统内部索引,唯一约束依赖这个唯一索引。
  • 如果要删除该索引需要先删除这个唯一约束,然后唯一索引自动被删除。
  • 下面这条语句可以查出所有约束,可根据表名进行筛选。
SELECT a.OWNER, a.TABLE_NAME, b.COLUMN_NAME, a.CONSTRAINT_NAME
from DBA_CONSTRAINTS a, ALL_CONS_COLUMNS b where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME and CONSTRAINT_TYPE='U';
  • 1
  • 2
  • 然后删除约束
alter table 模式名.表名 drop constraint 约束名;
  • 1
  • 达梦数据库id自增实现
create sequence hello_word_id start with 1 increment by 1;  # 创建自增序列
alter table DEPART_INFO modify (id default hello_word_id.nextval not null);  # 关联序列
  • 1
  • 2

达梦数据库锁超时问题

在执行sql语句时显示锁超时,执行不成功

  • 该语句可以查出对应表上的某种锁是由哪个session加上的,可以根据NAME筛选
select vs.SESS_ID,b.NAME,a.* from v$lock a LEFT JOIN SYS.SYSOBJECTS b on b.ID = a.TABLE_ID left join v$sessions vs on vs.TRX_id = a.Trx_id where b.NAME is NOT null
  • 1
  • 找出sess_id,进行删除。不知道哪一条我选择全删掉。
sp_close_session('sess_id');
  • 1

达梦数据库新建数据库

每次创建用户会自带一个与用户名相同的数据库schema,会默认使用这个库。最好使用这个数据库,因为在这个用户下再创建其它库,web项目连接达梦此用户时使用默认库,如何选择其它库不知道怎么改。当在这个用户下再新建数据库后,新建表需要指定库名,否则全部创建在默认数据库下。所以新建数据库建议先使用管理员账户SYSDBA(初始密码同这个)创建用户。否则写代码连接数据库需要指定。

  • CREATE USER IF NOT EXISTS use_name IDENTIFIED BY password LIMIT CONNECT_TIME 20;

需要管理员账户授权用户创建shema和表。创建用户,指定连接20分钟端断开。

  • GRANT CREATE SCHEMA TO username;
  • GRANT CREATE TABLE TO username;
  • CREATE SCHEMA 数据库名
  • create table 表名(id bigint primary key IDENTITY(1,1), …)

创建数据库表,没有datetime字段,使用timestamp,表comment和字段comment也没有,需要在创表之后单独运行。低版本也没有json数据类型,也没有longtext数据类型。没有自增id,需要使用上面方法来解决。
对用户进行数据库表操作授权

  • GRANT CREATE INDEX ON table_name TO username;
  • GRANT SELECT ON V$CIPHERS TO your_username; # 视图权限
  • GRANT CREATE sequence TO username; # 创建序列权限

新创建的用户数据库报错,没有SYSOBJECTS对象查询权限

grant soi to 用户名;
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/630284
推荐阅读
相关标签
  

闽ICP备14008679号