安装

Ubuntu安装

安装前准备

新建 dmdba 用户

注意:安装前必须创建 dmdba 用户,禁止使用 root 用户安装数据库。

  1. 创建用户所在的组,命令如下:
groupadd dinstall -g 2001
  1. 创建用户,命令如下:
useradd  -G dinstall -m -d /home/dmdba -s /bin/bash -u 2001 dmdba
  1. 修改用户密码,命令如下:
passwd dmdba

修改文件打开最大数

打开配置文件

vi /etc/security/limits.conf

# End of file后面添加如下内容

dmdba  soft      nice       0
dmdba hard nice 0
dmdba soft as unlimited
dmdba hard as unlimited
dmdba soft fsize unlimited
dmdba hard fsize unlimited
dmdba soft nproc 65536
dmdba hard nproc 65536
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft core unlimited
dmdba hard core unlimited
dmdba soft data unlimited
dmdba hard data unlimited

修改文件中需要重新启动

切换dmdba用户,查看是否生效

su - dmdba

ulimit -a

目录规划

#实例保存目录
mkdir -p /dmdata/data
#归档保存目录
mkdir -p /dmdata/arch
#备份保存目录
mkdir -p /dmdata/dmbak

修改目录权限

chown -R dmdba:dinstall /dmdata/data
chown -R dmdba:dinstall /dmdata/arch
chown -R dmdba:dinstall /dmdata/dmbak

chmod -R 755 /dmdata/data
chmod -R 755 /dmdata/arch
chmod -R 755 /dmdata/dmbak

数据库安装

到官网下载iso文件,https://eco.dameng.com/download/

下载完成会得到一个zip文件,将其解压得到iso文件,将该文件拖到Ubuntuopt目录中

切换到root用户,并且将iso文件进行挂载

cd  /opt
mount -o loop dm8_20240116_x86_rh7_64.iso /mnt

使用命令行安装

切换到dmdba用户,并且进入挂载的地址/mnt

su - dmdba
cd /mnt

执行安装命令

./DMInstall.bin -i

选择安装语言[1]、Key文件路径[n]、时区[21]、安装类型[1]、安装目录[/home/dmdba/dmdbms]

安装完毕后,切换为root用户,并执行安装结束提示的命令,进行安装DmAPService

su
/home/dmdba/dmdbms/script/root/root_installer.sh

配置实例

切换至目录

su - dmdba
cd /home/dmdba/dmdbms/bin

查看实例初始化可配置的参数

./dminit help

执行初始化配置实例命令,并且设置密码,密码要求必须具有大小写字母和数字

./dminit path=/dmdata/data SYSDBA_PWD=******  SYSAUDITOR_PWD=*****

注册服务

进入目录

cd /home/dmdba/dmdbms/script/root/

执行注册服务命令

./dm_service_installer.sh -t dmserver -dm_ini /dmdata/data/DMTEST/dm.ini -p DMTEST

使用

Python

SQLAlchemy

安装dm的Python驱动

下载官网提供的驱动包,https://eco.dameng.com/download/

解压后的目录

需要安装两个包,dmPythonsqlalchemy2.0.0

进入dmPython目录,执行安装命令

python setup.py install

进入sqlalchemy2.0.0目录,执行安装命令

python setup.py install

安装完成后执行命令,检查是否已经成功安装

pip list

示例代码

创建示例表

create table "SYSDBA"."FLASK"
(
"PRODUCTID" INTEGER not null ,
"NAME" VARCHAR(50),
"AUTHOR" VARCHAR(50),
"PUBLISHER" VARCHAR(50),
"PUBLISHTIME" DATE,
"PRODUCTNO" VARCHAR(50),
"SATETYSTOCKLEVEL" INTEGER,
"ORIGINALPRICE" DECIMAL(22, 6),
"NOWPRICE" DECIMAL(22, 6),
"DISCOUNT" DECIMAL(22, 6),
"DESCRIPTION" TEXT,
"PHOTO" BLOB,
"TYPE" VARCHAR(50),
"PAPERTOTAL" INTEGER,
"WORDTOTAL" INTEGER,
"SELLSTARTTIME" DATE,
"SELLENDTIME" DATE,
primary key("PRODUCTID")
)
storage(initial 1, next 1, minextents 1, fillfactor 0)
;

创建flask示例项目

文件夹结构

构建模型类,./models/ProductModel.py

# -*- coding: utf-8 -*-


# 构建模型类
from app import db


# 构建模型类
class Product(db.Model):
# 设置表名,表名默认为类名小写
__tablename__ = 'FLASK'
PRODUCTID = db.Column(db.Integer, primary_key=True, autoincrement=True)
NAME = db.Column(db.String(100))
AUTHOR = db.Column(db.String(25))
PUBLISHER = db.Column(db.String(50))
PUBLISHTIME = db.Column(db.Date)
PRODUCTNO = db.Column(db.String(25))
SATETYSTOCKLEVEL = db.Column(db.Integer)
ORIGINALPRICE = db.Column(db.Numeric(19, 4))
NOWPRICE = db.Column(db.Numeric(19, 4))
DISCOUNT = db.Column(db.Numeric(2, 1))
DESCRIPTION = db.Column(db.Text)
# 图片转化为二进制数据进行存储
PHOTO = db.Column(db.LargeBinary)
TYPE = db.Column(db.String(5))
PAPERTOTAL = db.Column(db.Integer)
WORDTOTAL = db.Column(db.Integer)
SELLSTARTTIME = db.Column(db.Date)
SELLENDTIME = db.Column(db.Date)

def __repr__(self): # 自定义 交互模式 & print() 的对象打印
return "(%d, %s, %s, %s)" % (self.PRODUCTID, self.NAME, self.AUTHOR, self.DESCRIPTION)

构建flask app初始化方法

# -*- coding: utf-8 -*-

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


def init_app():
app = Flask(__name__)

# 解决页面中问乱码问题
app.config['JSON_AS_ASCII'] = False
# 设置数据库链接地址
app.config['SQLALCHEMY_DATABASE_URI'] = "dm+dmPython://SYSDBA:John123456@192.168.1.26:5236"
# 设置显示底层执行的sql语句
app.config['SQLALCHEMY_ECHO'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

# 初始化组件对象,关联flask应用
db.init_app(app)

return app

构建flask入口启动程序与路由

# -*- coding: utf-8 -*-
from flask import Response, json

from app import init_app, db
from models.ProductModel import Product

app = init_app()


@app.route("/query_all")
def query_all():
# 查询所有用户数据, 返回User列表,
data = Product.query.all()
response_data = []
for item in data:
info = dict()
info['PRODUCTID'] = item.PRODUCTID
info['NAME'] = item.NAME
info['AUTHOR'] = item.AUTHOR
info['DESCRIPTION'] = item.DESCRIPTION
response_data.append(info)

return Response(json.dumps(response_data), mimetype='application/json')


@app.route("/query_first")
def query_filter():
# 查询所有用户数据, 返回User列表,
data = Product.query.filter_by(NAME='面纱').first()
response_data = dict()
response_data['PRODUCTID'] = data.PRODUCTID
response_data['NAME'] = data.NAME
response_data['AUTHOR'] = data.AUTHOR
response_data['DESCRIPTION'] = data.DESCRIPTION

return Response(json.dumps(response_data), mimetype='application/json')


@app.route("/add_one")
def add_one():
# 添加一条数据
# 将图片转化为二进制数据进行存储
product = Product(PRODUCTID=1,
NAME='万历十五年',
AUTHOR='黄仁宇',
PUBLISHER='中华书局',
PUBLISHTIME='1981-09-01',
PRODUCTNO='9787101046126',
SATETYSTOCKLEVEL=10, ORIGINALPRICE=39.8000, NOWPRICE=20.0000,
DISCOUNT=5.0,
DESCRIPTION='《万历十五年》以1587年为关节点,在历史的脉络中延伸,从政治、经济、军事等各个方面的历史大事与人物着手,记叙了明朝中晚期的种种社会矛盾和开始走向衰败的迹象。',
PHOTO=open(
'D:\\code\\www\\code\\connect_db\\flask_dm\\1.jpg', 'rb').read(),
TYPE='16', PAPERTOTAL=684, WORDTOTAL=68000,
SELLSTARTTIME='2006-03-20', SELLENDTIME='2023-11-1'
)
db.session.add(product)
db.session.commit()
return Response('数据插入成功,本次插入数据的PRODUCTID为{}'.format(product.PRODUCTID), mimetype='application/json')


@app.route("/add_list")
def add_list():
# 一次添加多条数据
data_list = [
Product(PRODUCTID=2,
NAME='面纱', AUTHOR='威廉·萨默塞特·毛姆', PUBLISHER='人民文学出版社', PUBLISHTIME='2020-04-01',
PRODUCTNO='9787101046127',
SATETYSTOCKLEVEL=10, ORIGINALPRICE=39.8000, NOWPRICE=20.0000,
DISCOUNT=5.0,
DESCRIPTION='小说的故事发生在香港和一个叫“湄潭府”的地方。女主人公凯蒂·费恩因为和香港助理布政司查理通奸,被丈夫瓦尔特(细菌学家)发现后胁迫她去了霍乱横行的湄潭府,最终瓦尔特不幸染病死去,凯蒂回到香港,重投查理怀抱后羞愧不已,最终回到英国和父亲和解,并和父亲同往巴哈马群岛生活。',
PHOTO=open(
'C:/Users/Administrator/PycharmProjects/FlaskDm/application/ORF.jpg', 'rb').read(),
TYPE='16', PAPERTOTAL=684, WORDTOTAL=68000, SELLSTARTTIME='2006-03-20',
SELLENDTIME='2023-11-1'),
Product(PRODUCTID=3,
NAME='乖,摸摸头', AUTHOR='大冰', PUBLISHER='湖南文艺出版社', PUBLISHTIME='2014-10-01',
PRODUCTNO='9787101046129',
SATETYSTOCKLEVEL=10, ORIGINALPRICE=39.8000, NOWPRICE=20.0000,
DISCOUNT=5.0,
PHOTO=open(
'C:/Users/Administrator/PycharmProjects/FlaskDm/application/OWW.jpg', 'rb').read(),
DESCRIPTION='此书记录了大冰十余年的江湖游历,以及他和他朋友们的爱与温暖的传奇故事。',
TYPE='16', PAPERTOTAL=684, WORDTOTAL=68000, SELLSTARTTIME='2006-03-20',
SELLENDTIME='2023-11-1')
]

db.session.add_all(data_list)
db.session.commit()
return Response('数据插入成功,本次共插入{}条数据'.format(len(data_list)))


@app.route("/updata_info")
def updata_info():
# 直接根据条件修改
Product.query.filter(Product.PRODUCTID == 2).update(
{Product.NAME: '面纱(中文)'})
db.session.commit()

# 查询修改后的值
data = Product.query.filter_by(PRODUCTID=2).first()
response_data = dict()
response_data['PRODUCTID'] = data.PRODUCTID
response_data['NAME'] = data.NAME

return Response(json.dumps(response_data), mimetype='application/json')


@app.route("/delete_info")
def delete_info():
# 直接根据条件修改
Product.query.filter(Product.PRODUCTID == 1).delete()
db.session.commit()

# 查询修改后的值
t_count = Product.query.count()

return Response('数据删除成功!目前表中还有{}条数据!'.format(t_count))


@app.route("/")
def HELLO_DM():
return 'HELLO DM'


if __name__ == '__main__':
app.run(host="127.0.0.1", port=5000, debug=True)

JDBC

安装dm的JDBC驱动jar文件

到官网下载JDBC的驱动包,https://eco.dameng.com/download/

解压后的文件夹结构

选择合适的jar包移动到项目中

示例代码

安装jaydebeapi

pip install jaydebeapi

dm_test.py文件,注意修改jar_filejar包的位置

import os
import jaydebeapi


class DamengConnection:
def __init__(self, db_host, db_port, db_user, db_password):
self.host = db_host
self.port = db_port
self.dba_user = db_user
self.dba_password = db_password

def getConnection(self):
url = 'jdbc:dm://{host}:{port}'.replace("{host}", self.host).replace("{port}", str(self.port))
driver = 'dm.jdbc.driver.DmDriver'
# 驱动所在位置
jar_file = os.path.join(os.path.dirname(__file__), "jar_driver/DmJdbcDriver8.jar")

conn = jaydebeapi.connect(driver, url, [self.dba_user, self.dba_password], jar_file)
return conn

if __name__ == '__main__':
con = DamengConnection("192.168.1.26", '5236', "SYSDBA", "John123456")
cursor = con.getConnection().cursor()
sql = 'select * from "test-db".TABLE_1'
cursor.execute(sql)
result = cursor.fetchall()
for e in result:
print(e)