MogDB企业应用 之 七种武器

如今江湖上最卷的门派,非国产数据库莫属。各位大侠们往往把精力放在拼内功(内核/架构)、拼身法(性能)、拼拳脚(功能/兼容性)、拼江湖地位(生态/社区)。然而好像并不怎么重视兵(武)器(接口/驱动/API),当然,可能我是搞C/C++出身,也许搞JAVA的兄弟并不会遇到这样的困惑,因为一套JDBC可以打遍天下。虽然市场占有率的头把交椅JAVA已经做了很多年,但随着各种开发语言的大行其道,现代企业的信息化系统中不太可能只使用单一的开发语言。因此闯荡江湖还是需要几把趁手的兵器!

本文以古龙先生的《七种武器》和武器的寓意作为类比,简单分析MogDB各种驱动的优势与应用场景。

七种武器分别是:长生剑——寓意“笑”;孔雀翎——寓意“自信”;碧玉刀——寓意“诚实”;多情环——寓意“仇恨”;霸王枪——寓意“勇气”;离别钩——寓意“团聚”;箱子——寓意“道”;

当然,《七种武器》与MogDB驱动的类比并非那么贴切,甚至有些牵强。如果各位大侠有不同见解欢迎留言评论,一起切磋MogDB的“道”。

长生剑——psycopg

天上白玉京 五楼十二城 仙人抚我顶 结发授长生。

长生剑!江湖中最可怕的一把剑。他只有杀人,从没有人能杀死他!长生剑的讲的是“笑”——“无论多锋利的剑,也比不上那动人的一笑。一个人只要懂得利用自己的长处,根本不必用武功也一样能够将人击倒”。

“笑”对于每个人来说再简单不过了,是每个人都能利用的一件武器。和笑一样简单的开发语言那当属Python了。Python是一种代表简单主义思想的语言,它编写的程序读起来就感觉像是在读英语段落一样流畅。它懂得利用自己的长处——化繁为简,可以玩AI、大数据、做运维甚至非专业开发人员也可以熟练使用它,包括小朋友也可以拿它来进行逻辑思维的扩展。psycopg这把“长生剑”用最简单的方式杀敌于无形。

功法

江湖上有一篇入门心法供各位参考使用Python-psycopg访问postgres、openGauss、MogDB

  • 安装

获取安装介质,下载。

$ tar -zxvf openGauss-3.0.0-openEuler-x86_64-Python.tar.gz
# cp -r /home/postgres/psycopg2/ /usr/lib/python3.7/site-packages/
# chmod -R 775 psycopg2/
  • 验证
$ python3
Python 3.7.9 (default, Jan 25 2022, 15:12:36)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> conn=psycopg2.connect(database="postgres",user="frank",password="frank@123",host="localhost",port=5432)
>>> cur=conn.cursor()
>>> cur.execute("CREATE TABLE student(id integer,name varchar,sex varchar);")
>>> cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(1,'Aspirin','M'))
>>> cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(2,'Taxol','F'))
>>> cur.execute('SELECT * FROM student')
>>> results=cur.fetchall()
>>> print (results)
[(1, 'Aspirin', 'M'), (2, 'Taxol', 'F')]
>>> conn.commit()
>>> cur.close()
>>> conn.close()
>>>

秘籍

继续修炼请参考官方文档

江湖

能够完美的发挥自己的特长,胜过手中锋利的剑。有了psycopg,MogDB可以在很多领域大展拳脚,比如爬虫系统、运维系统、AI、数据分析甚至是日常办公。也可以让MogDB在很多非核心的企业应用中发挥关键作用,让MogDB更贴近普通人的舒适工作区。

孔雀翎——node-postgres

孔雀翎是早已不存在的暗器,高立向朋友秋凤梧借来孔雀翎,信心十足地杀了强敌,这才发现孔雀翎已丢失。而秋凤梧告诉他,孔雀翎早就没有了,他借给高立的只是“信心”。“真正的胜利,并不是你用武器争取的,一定要用你的信心。无论多可怕的武器,也比不上人的信心。”

前些年有这样一个梗,PHP是“最好编程语言”,JavaScript将“一统天下”。不说PHP了,单讲JavaScript的信心其实并非空穴来风,从前端开发中最能打的武器,到几行代码就可以写出HTTP的服务“后端”,再到“全栈”、“大前端”。在江湖的各个门派中都有JS的一席之地。而node-postgres正是作为PostgreSQL体系数据库的那把泰山之巅的“暗器”。

功法

  • 安装
$ npm install pg
  • 范例
const { Client } = require('pg')
const client = new Client()
client.connect()
client.query('SELECT version()::text as version',  (err, res) => {console.log(err ? err.stack : res.rows[0].version)client.end()
})
  • 验证
PGUSER=frank \
PGHOST=localhost \
PGPASSWORD=frank@123 \
PGDATABASE=postgres \
PGPORT=15432 \
node test.js

实测验证最新的8.7.3版本node-postgres在MogDB 3.0.0上可正常使用,输出如下:

(MogDB 3.0.0 build 62408a0f) compiled at 2022-06-30 14:21:11 commit 0 last mr   on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit

秘籍

上面的例子只是简单的范例,如果各位想继续修炼可以参考官方文档。

江湖

如果你用nodejs开发小型网站系统,爬虫系统、或者微服务架构系统要是想使用一款数据库,那么MogDB也将会出现在你的备选方案中。而node-postgres就是MogDB心中的“孔雀翎”。

碧玉刀——libpqxx

段家的碧玉刀非但价值连城,而且故老相传,都说其中还藏着一个很大的秘密。无论谁只要能解开这秘密,他立刻就可能变成富可敌国的武林高手。

尺八长的碧玉刀看上去并不华丽,也谈不上绝世神兵,气质上看起来与libpqxx有几分相似。说到libpqxx可能鲜有人知,甚至使用它的就更少了,但如果能够解开它背后的秘密或许会变成“富可敌国的武林高手”。也许大家已经猜到它背后的秘密就是——libpq。其实libpqxx也是出自名门正派,它是PostgreSQL官方开源C++ 客户单API。它华丽的C++外表下有着一颗C朴实的心,这也正符合了碧玉刀“诚实”的气质。

功法

还是先推荐一篇江湖上的典籍libpqxx (PostgreSQL C++ API)——使用简介

  • 安装
git clone https://github.com/jtv/libpqxx
git checkout 6.4
./configure --disable-documentation
make -j8
make check -j 8
make install
  • 范例

test.sql

CREATE TABLE public.employee (id int4 NULL,"name" varchar(20) NULL,gender bpchar(2) NULL,birthday date NULL,email bpchar(10) NULL,remark varchar(50) NULL,salary int8 NULL
);
insert into employee (id,name,gender,birthday,email,remark,salary) values(1,'frank','男','2014-02-23','f@123.com','',1000);

main.cpp

#include <iostream>
#include <pqxx/pqxx>int main()
{try{pqxx::connection C;std::cout << "Connected to " << C.dbname() << std::endl;pqxx::work W(C);pqxx::result R = W.exec("SELECT name FROM employee");std::cout << "Found " << R.size() << "employees:" << std::endl;for (auto row: R)std::cout << row[0].c_str() << std::endl;std::cout << "Doubling all employees' salaries..." << std::endl;W.exec("UPDATE employee SET salary = salary*2");std::cout << "Making changes definite: ";W.commit();std::cout << "OK." << std::endl;}catch (const std::exception &e){std::cerr << e.what() << std::endl;return 1;}return 0;
}

run.sh

rm -rf a.out
g++ main.cpp -lpqxx -lpq  -L/home/frank/pgsql/lib
export PGDATABASE=postgres
export PGHOST=localhost
export PGPORT=15432
export PGUSER=frank
export PGPASSWORD=frank@123
psql -h localhost -p 15432  -d postgres -U frank -W 'frank@123' -f test.sql
./a.out
  • 编译
g++ main.cpp -lpqxx -lpq  -L/home/frank/pgsql/lib
  • 验证
frank@DESKTOP-6NF3B9K:~/test/libpqxx$ sh run.sh
psql: warning: extra command-line argument "frank@123" ignored
Password:
DROP TABLE
CREATE TABLE
INSERT 0 1
Connected to postgres
Found 1employees:
frank
Doubling all employees' salaries...
Making changes definite: OK.

秘籍

继续修炼请参考官方文档。

江湖

libpqxx并不是什么绝世神兵,他能做的事情libpq都可以做,但通过C++封装后,它具备了更加友好的用户接口,同时也大大提升了开发效率,如果您使用C++开发MogDB的应用,或者您公司使用比较高版本的C++标准,例如:C++17,那么libpqxx会大幅减少您公司的开发成本,并且保证了代码风格的一致性。相信MogDB配上了libpqxx这把“碧玉刀”,在江湖路上必将一路坦途。

霸王枪——Golang pq

霸王枪长一丈三尺七寸三分,重七十三斤七两三钱。霸王枪象征勇气。“一个人只要有勇气去冒险,天下就绝没有不能解决的事。”

Golang是年轻充满朝气的开发语言,它诞生于2007年,发布与2009年,自发布以来,披荆斩棘,一时间搅得江湖上不得安宁。Golang以编译型语言的姿态挑战C的性能,以轻量级的携程挑战java和c++的并发,从日志处理、运维监控,到虚拟机、容器、区块链等后端,再到代理、web应用、API应用,凭着这股“勇气”,在各个领域Go都有上佳表现。

Golang pq对于PostgreSQL系的数据库有着非常重要的作用,不仅仅是在企业应用中,在MogDB的周边工具(如MTK等)开发中,这杆“霸王枪”也发发挥了重要作用,也许日后MogDB的监控和运维工具也会有Golang pq的一席之地。

对于Golang pq,恩墨也有自己的版本:openGauss-connector-go-pq

功法

  • 获取
go get gitee.com/opengauss/openGauss-connector-go-pq
  • 注意:如果遇到golang.org/x/ 报错相关问题可以使用下面方法
mkdir $GOPATH/src/golang.org/x/
cd $GOPATH/src/golang.org/x/
git clone https://github.com/golang/text.git text
git clone https://github.com/golang/crypto.git crypto
git clone https://github.com/golang/xerrors.git xerrors
go install text
go install crypto
go install xerrors
  • 范例
package main
import ("fmt""log""database/sql"_ "gitee.com/opengauss/openGauss-connector-go-pq"
)func main() {connStr := "host=127.0.0.1 port=15432 user=frank password=frank@123 dbname=postgres sslmode=disable"// db, err := sql.Open("opengauss", connStr)db, err := sql.Open("mogdb", connStr)if err != nil {log.Fatal(err)}var version stringerr = db.QueryRow("select version()").Scan(&version)if err != nil {log.Fatal(err)}fmt.Println(version)
}
  • 验证
frank@DESKTOP-6NF3B9K:~/test/go/src$ ll
total 7480
drwxr-xr-x 5 frank frank    4096 Aug  6 09:31 ./
drwxr-xr-x 4 frank frank    4096 Aug  5 21:54 ../
drwxr-xr-x 3 frank frank    4096 Aug  5 21:52 gitee.com/
drwxr-xr-x 3 frank frank    4096 Aug  5 21:52 github.com/
drwxr-xr-x 3 frank frank    4096 Aug  5 21:54 golang.org/
-rwxr-xr-x 1 frank frank 7631349 Aug  6 09:26 main*
-rw-r--r-- 1 frank frank     480 Aug  5 21:57 main.go
frank@DESKTOP-6NF3B9K:~/test/go/src$ ./main
(MogDB 3.0.0 build 62408a0f) compiled at 2022-06-30 14:21:11 commit 0 last mr   on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit
frank@DESKTOP-6NF3B9K:~/test/go/src$

秘籍

Golang pq 源码

openGauss-connector-go-pq源码

江湖

Golang就像横空出世的霸王枪,凭借着“勇气”已经撼动了不少企业级的JAVA和C/C++应用,一些企业的核心系统已经逐渐的开始向Golang转型。随着应用架构的不断演进,MogDB想在江湖上保持竞争力,一定要紧握Golang pq这杆抢。

多情环——JDBC

多情自古空余恨,好梦由来最易醒。岂是拈花难解脱,可怜飞絮太飘零。

想必大家还记得Oracle宣布JDK 8u202以上版本开始商用收费的消息,“好梦由来最易醒”,从SUN到Oracle再到商用收费,也许这是必然的过程,随着商用收费的宣布,我们的梦也应该醒了。虽然可以选择继续使用低版本,或者openJDK,但一定会对企业应用和未来的技术路线有一定的冲击。欣喜的是国内的华为、阿里也有基于openJDK的产品,但在我们庞大系统中分散着太多依赖JDK的组件,需要全面的兼容性评估——岂是拈花难解脱,可怜飞絮太飘零

java无疑是目前市场占有率做大的一门企业级开发语言,没有之一。可以说几乎没有企业的信息化系统不使用java作为主要的技术栈,从业务系统、大数据、信息系统几乎java应用遍及大部分核心系统。作为应用与数据库的桥梁——JDBC来说真是又爱又恨。

功法

  • 安装

官方软件包

  • 范例
import java.sql.*;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class JdbcDemo {public static void main(String[] args) throws Exception {System.out.println("System.out.println(rs.getString(1));");Class.forName("org.opengauss.Driver");Connection conn = DriverManager.getConnection("jdbc:opengauss://localhost:15432/postgres?user=frank&password=frank@123&ssl=false");String sql = "select version()";Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);while (rs.next()){System.out.print("Version : ");System.out.println(rs.getString(1));}stmt.close();conn.close();}
}
  • 验证
$ export CLASSPATH=/home/frank/test/java/opengauss-jdbc-3.0.0.jar:$CLASSPATH
$ javac JdbcDemo.java
$ java JdbcDemo
System.out.println(rs.getString(1));
Aug 06, 2022 10:24:12 AM org.opengauss.core.v3.ConnectionFactoryImpl openConnectionImpl
INFO: [11a01b6b-3b51-4549-b552-6f836646ef36] Try to connect. IP: localhost:15432
Aug 06, 2022 10:24:12 AM org.opengauss.core.v3.ConnectionFactoryImpl openConnectionImpl
INFO: [127.0.0.1:39218/ocalhost/127.0.0.1:15432] Connection is established. ID: 11a01b6b-3b51-4549-b552-6f836646ef36
Aug 06, 2022 10:24:12 AM org.opengauss.core.v3.ConnectionFactoryImpl openConnectionImpl
INFO: Connect complete. ID: 11a01b6b-3b51-4549-b552-6f836646ef36
Version : (MogDB 3.0.0 build 62408a0f) compiled at 2022-06-30 14:21:11 commit 0 last mr   on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit

秘籍

PostgreSQL JDBC Driver

openGauss Connectors

江湖

对java我们有着复杂的感情,国内有着最多的java程序员群体,甚至可以用“过剩”这个词。对于JDK来说,虽然国内像阿里、华为这样的大厂已经有了JDK的产品,但尚未成熟,需要社区继续努力和生态的支撑。MogDB作为基于openGauss的企业级数据库,严格说也属于华为鲲鹏生态的一部分,华为有着完备的全栈生态体系,从Kunpeng 处理器、openEuler操作系统、openGauss/GaussDB数据库到毕昇编译器,毕昇JDK。在IT技术垂直领域几乎面面俱到。MogDB是华为数据库生态领域的水平拓展,既享受着生态的红利,又是生态建设的主要力量——恩墨对openGauss社区的贡献仅次于华为。

离别钩——ODBC

“你为什么要用如此残酷的武器?”“因为我不愿被人强迫与我所爱的人离别。”……“你用离别钩,只不过为了要相聚。”

说起ODBC,一些早年的程序员会比较熟悉,但现在似乎渐渐的与我们“离别”,JDBC也是复用了ODBC的思想后大行其道,但由于原生的数据库C/C++接口从性能到兼容性上表现的更为出色,而C/C++往往追求的恰恰是性能,所以ODBC在企业应用的用武之地变得越来越少。

功法

  • 安装

获取unixODBC

获取openGauss ODBC驱动

tar -zxvf unixODBC-2.3.7pre.tar.gz
cd unixODBC-2.3.7pre
./configure
make -j6
sudo make install
tar -zxvf openGauss-3.0.0-ODBC.tar.gzexport ODBCSYSINI=/usr/local/etc
export ODBCINI=/usr/local/etc/odbc.ini
export LD_LIBRARY_PATH=/home/frank/test/odbc/lib:/home/frank/test/odbc/odbc/lib:$LD_LIBRARY_PATH
  • 配置

/usr/local/etc/odbcinst.ini

# /usr/local/etc/odbcinst.ini
[GaussMPP]
Driver64=/home/frank/test/odbc/odbc/lib/psqlodbcw.so
setup=/home/frank/test/odbc/odbc/lib/psqlodbcw.so

/usr/local/etc/odbc.ini

# /usr/local/etc/odbc.ini
[MOGODBC]
Driver=GaussMPP
Servername=localhost
Database=postgres
Username=frank
Password=frank@123
Port=15432
Sslmode=disable
frank@DESKTOP-6NF3B9K:/usr/local/etc$ isql -v MOGODBC
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select version();
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| version                                                                                                                                                                                                                                                                                                     |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| (MogDB 3.0.0 build 62408a0f) compiled at 2022-06-30 14:21:11 commit 0 last mr   on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit                                                                                                                                                            |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
SQLRowCount returns 1
1 rows fetched
SQL>
  • 范例
// 此示例演示如何通过ODBC方式获取MogDB中的数据。
// DBtest.c (compile with: libodbc.so)
#include <stdlib.h>
#include <stdio.h>
#include <sqlext.h>
#ifdef WIN32
#include <windows.h>
#endif
SQLHENV       V_OD_Env;        // Handle ODBC environment
SQLHSTMT      V_OD_hstmt;      // Handle statement
SQLHDBC       V_OD_hdbc;       // Handle connection
char          typename[100];
SQLINTEGER    value = 100;
SQLINTEGER    V_OD_erg,V_OD_buffer,V_OD_err,V_OD_id;
int main(int argc,char *argv[])
{// 1. 申请环境句柄V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){printf("Error AllocHandle\n");exit(0);}// 2. 设置环境属性(版本信息)SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);// 3. 申请连接句柄V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);exit(0);}// 4. 设置连接属性SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON, 0);// 5. 连接数据源,这里的“userName”与“password”分别表示连接数据库的用户名和用户密码,请根据实际情况修改。// 如果odbc.ini文件中已经配置了用户名密码,那么这里可以留空("");但是不建议这么做,因为一旦odbc.ini权限管理不善,将导致数据库用户密码泄露。V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "MOGODBC", SQL_NTS,(SQLCHAR*) "frank", SQL_NTS,  (SQLCHAR*) "frank@123", SQL_NTS);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){printf("Error SQLConnect %d\n",V_OD_erg);SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);exit(0);}printf("Connected !\n");// 6. 设置语句属性SQLSetStmtAttr(V_OD_hstmt,SQL_ATTR_QUERY_TIMEOUT,(SQLPOINTER *)3,0);// 7. 申请语句句柄SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);// 8. 直接执行SQL语句。SQLExecDirect(V_OD_hstmt,"drop table IF EXISTS customer_t1",SQL_NTS);SQLExecDirect(V_OD_hstmt,"CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));",SQL_NTS);SQLExecDirect(V_OD_hstmt,"insert into customer_t1 values(25,li)",SQL_NTS);// 9. 准备执行SQLPrepare(V_OD_hstmt,"insert into customer_t1 values(?)",SQL_NTS);// 10. 绑定参数SQLBindParameter(V_OD_hstmt,1,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&value,0,NULL);// 11. 执行准备好的语句SQLExecute(V_OD_hstmt);SQLExecDirect(V_OD_hstmt,"select id from testtable",SQL_NTS);// 12. 获取结果集某一列的属性SQLColAttribute(V_OD_hstmt,1,SQL_DESC_TYPE,typename,100,NULL,NULL);printf("SQLColAtrribute %s\n",typename);// 13. 绑定结果集SQLBindCol(V_OD_hstmt,1,SQL_C_SLONG, (SQLPOINTER)&V_OD_buffer,150,(SQLLEN *)&V_OD_err);// 14. 通过SQLFetch取结果集中数据V_OD_erg=SQLFetch(V_OD_hstmt);// 15. 通过SQLGetData获取并返回数据。while(V_OD_erg != SQL_NO_DATA){SQLGetData(V_OD_hstmt,1,SQL_C_SLONG,(SQLPOINTER)&V_OD_id,0,NULL);printf("SQLGetData ----ID = %d\n",V_OD_id);V_OD_erg=SQLFetch(V_OD_hstmt);};printf("Done !\n");// 16. 断开数据源连接并释放句柄资源SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);SQLDisconnect(V_OD_hdbc);SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);return(0);}
  • 验证
frank@DESKTOP-6NF3B9K:~/test/odbc$ gcc main.c -lodbc -o main -w
frank@DESKTOP-6NF3B9K:~/test/odbc$ ./main
Connected !
SQLColAtrribute
Done !

秘籍

看了网上的一些文档综合比下来ODBC这块还是参考MogDB官方文档 (客观的讲,MogDB的文档在对比其竞品确实做的很好)

江湖

离别意味着再次相聚,随着国产数据库迁移的步伐加快,在选型或者过度阶段可能会同时适配多种不同的数据库,诸如:mysql体系、postgres体系或者完全自研的国产数据库,如果适配每一种数据库都使用期原生的C/C++驱动,那么无形中会增加很大的工作量,既是有系统有很好的架构设计(有SQL适配层或者使用ORM)也避免不了要做全面的测试。但据我目前的实践经验看,几乎所有的国产关系型数据库都提供了ODBC(就像JDBC一样)标准的接口,这样只要适配了ODBC接口就可以一劳永逸。

箱子——libpq

《英雄无泪》塑造出一个极为经典的兵器-箱子,这口箱子复杂玄妙,可任意变换成各种兵器,是武器的集大成者。箱子寓意武者的“道”。

任何武器都是身外之物,只有libpq是和内核代码放在一起,所以说它并非武器,而是“道”是PostgreSQL的“道”也是openGauss/MogDB的“道”。

功法

  • 安装

获取安装介质

  • 范例
/** testlibpq.c*/
#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>static void
exit_nicely(PGconn *conn)
{PQfinish(conn);exit(1);
}int
main(int argc, char **argv)
{const char *conninfo;PGconn     *conn;PGresult   *res;int         nFields;int         i,j;/** 用户在命令行上提供了conninfo字符串的值时使用该值* 否则环境变量或者所有其它连接参数* 都使用缺省值。*/if (argc > 1)conninfo = argv[1];elseconninfo = "dbname=postgres port=42121 host='10.44.133.171' application_name=test connect_timeout=5 sslmode=allow user='test' password='test_1234'";/* 连接数据库 */conn = PQconnectdb(conninfo);/* 检查后端连接成功建立 */if (PQstatus(conn) != CONNECTION_OK){fprintf(stderr, "Connection to database failed: %s",PQerrorMessage(conn));exit_nicely(conn);}/** 测试实例涉及游标的使用时候必须使用事务块*把全部放在一个  "select * from pg_database"* PQexec() 里,过于简单,不推荐使用*//* 开始一个事务块 */res = PQexec(conn, "BEGIN");if (PQresultStatus(res) != PGRES_COMMAND_OK){fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));PQclear(res);exit_nicely(conn);}/** 在结果不需要的时候PQclear PGresult,以避免内存泄漏*/PQclear(res);/** 从系统表 pg_database(数据库的系统目录)里抓取数据*/res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");if (PQresultStatus(res) != PGRES_COMMAND_OK){fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn));PQclear(res);exit_nicely(conn);}PQclear(res);res = PQexec(conn, "FETCH ALL in myportal");if (PQresultStatus(res) != PGRES_TUPLES_OK){fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn));PQclear(res);exit_nicely(conn);}/* 打印属性名称 */nFields = PQnfields(res);for (i = 0; i < nFields; i++)printf("%-15s", PQfname(res, i));printf("\n\n");/* 打印行 */for (i = 0; i < PQntuples(res); i++){for (j = 0; j < nFields; j++)printf("%-15s", PQgetvalue(res, i, j));printf("\n");}PQclear(res);/* 关闭入口 ... 不用检查错误 ... */res = PQexec(conn, "CLOSE myportal");PQclear(res);/* 结束事务 */res = PQexec(conn, "END");PQclear(res);/* 关闭数据库连接并清理 */PQfinish(conn);return 0;
}
  • 验证
export LD_LIBRARY_PATH=/home/frank/test/libpq/lib/:$LD_LIBRARY_PATH
gcc testlibpq.c -I include -L lib -lpq -o testlibpq

秘籍

PostgreSQL官方文档

MogDB官方文档

江湖

没有武器就是有武器,有武器就是没有武器。一口箱子可以任意变换成各种兵器,libpqxx、ODBC、node posstgres、psycopg等等都可以找到他的影子。libpq是PostgreSQL系数据库最强的武器,也是他们的道。

  • 幻化ODBC

  • 幻化libpqxx

  • 幻化node-postgres

番外篇

洋枪——OCI/OCCI

与上面的冷兵器不同,洋枪的出现改变了人类了的战争史。而“洋枪”这个词,在国人的心中有着意味深长的寓意,可能是“落后”、“屈辱”亦或是“卧薪尝胆的意志”。

这东西用着很顺手,或许是用惯了。当然如果找一件趁手的兵器替代它也并非难事,但是需要付出一定的学习成本和时间。那么不妨在过度期间我们可以先模仿它的用法,哪怕扣响扳机后打出来的不是“子弹”,而是“袖箭”。

很多大侠已经开始这么干了,相信MogDB也已经在路上。

尾声

MogDB可用的武器远不止七种,这里只是列出来企业级应用最常用的几种。就像开头说的,各位大侠们并不是那么地重视驱动,而丰富的数据库驱动接口是满足企业复杂的应该系统的必要条件。对于MogDB来说继承了祖上(PostgreSQL、openGauss)丰富的驱动接口,这是MogDB是优势。可能现在缺的就是一把“洋枪”。

这里还要特别提一下除了武器之外MogDB的一些拳脚功夫,像server端的过程语言:PL/pgSQl、PL/Tcl、PL/Perl、PL/Python、PL/Java;可以扩展内部函数:C FUNCTION、Embedded SQL in C;可以热插拔的插件:contrib下面C开发的插件、使用rust pgx开发的rust语言插件等等,就扩展性来说,我认为PostgreSQL/openGauss/MogDB是最强大的,没有之一,这也是MogDB吸引我的最重要原因。由于篇幅有限,后续有机会再和大家一起讨论 MogDB的拳脚功夫

MogDB企业应用 之 七种武器相关推荐

  1. ASP.NET企业开发框架IsLine FrameWork系列之三--七种武器

    ASP.NET企业开发框架IsLine FrameWork系列之三--七种武器 接上文 IsLine FrameWork Provider介绍 其中IsLine.Data.IsLine.AppLog是 ...

  2. 双十一在即,阿里的七种武器

    双十一临近,普大喜奔.天猫不是一个人在战斗.阿里十五年来,构建了丰富的产业生态,统称为阿里系.一支穿云箭,千军万马来相见.今天我们就来盘点一下阿里系各路诸侯,将如何助阵? 堪任一方霸主的诸侯,有微博. ...

  3. 谈谈UCloud保障数据安全的七种“武器”

    当前,数据安全受到多方面的威胁.有来自系统软硬件的非人为故障,有运维工程师的误操作,甚至是黑客或内部人员的恶意删除.2017年1月31日,全球最大的代码托管服务平台Gitlab由于工程师的误操作,删除 ...

  4. 对冲基金到底是什么:细数对冲基金的七种武器

    古龙小说<七种武器>里,列出了长生剑.孔雀翎.碧玉刀.多情环.离别钩.霸王枪.拳头等七种非一般江湖武器,分别对应着笑.自信心.诚实.仇恨.戒骄.勇气和不放弃. 1 长生剑/宏观(Macro ...

  5. “功夫高考”之高考状元的七种武器

    腾讯教育独家稿件 转载请注明出处作者 人生无处不江湖.有人的地方就有江湖,有江湖就有纷争!是的,高考也是江湖. 资料图片 莘莘学子就是这江湖的主角,家长老师也都是这江湖的成员.高考,就是他们为了登堂入 ...

  6. 图像所征服你的七种武器

    图像所征服你的七种武器 一.        优越的软硬件条件 图像所承担着大量的重大科研课题,技术装备精良,拥有价值3000余万元的实验仪器及设备.多谱段信息获取与成像技术研究相关贵重设备齐全,从微波 ...

  7. 转载》互联网中七种武器维护移动安全

    2019独角兽企业重金招聘Python工程师标准>>> 人在网上飘,最怕被黑客惦记,个人上网记录.私密信息.银行卡帐号.密码,都是黑客窃取的目标,让人实在没有安全感可言.下面,爱加密 ...

  8. 网优谷带你盘一盘重构IT基础架构的“七种武器”!

    重构IT基础架构的"七种武器"有哪些呢? 这些关键技术正在"重塑"企业IT基础架构以实现对大量宝贵数据更加快捷和更加灵活的访问. 重新构建企业IT基础架构不是一 ...

  9. 5G网络切片的七种武器(三)

    | 文章版权所有,未经授权请勿转载或使用 在公众号 [5G行业应用] 之前的两篇文章<5G网络切片的七种武器(一)>和<5G网络切片的七种武器(二)>中,我们介绍了5G网络切片 ...

最新文章

  1. Ext 整合 Jquery
  2. conv_general_dilated实现
  3. 2018-2019-1 20165234 实验三 并发程序
  4. TypeScript 的变量定义
  5. 使用vue组件搭建网页应用
  6. 英特尔傲腾存储业务主管已离职 因个人原因离开
  7. ogg批量配置_Mac批量文件重命名A Better Finder Rename11.07直装
  8. winrar64位怎么破解
  9. 华为服务器维修期,拆看一台1U华为服务器RH1288 V2-8S
  10. 同济大学高等数学第7版笔记和课后答案
  11. 验证码集合_您网站的免费验证码集合
  12. EXCEL数据分析——上海餐饮数据分析
  13. GoogleEarth二次开发平台指南(1) ---如何将谷歌地球嵌入到自定义的窗体中
  14. 如何使用Keil5中的虚拟示波器进行软件仿真
  15. Android 权限表,危险权限
  16. Change Log - 更改日志
  17. 京东7天无理由退货换货运费应该谁来出是商家支付还是买家支付?
  18. Quartz定时任务调度框架
  19. 微服务连载(一)微服务技术体系和六大组件
  20. CTF术语_ReversePwn(持续更新)

热门文章

  1. pod install/update 卡住
  2. Rsync远程同步+inotify监控实时同步概述,部署
  3. 博客园怎么设置背景图片
  4. 虚拟机可以ping通主机,主机无法ping通虚拟机的解决方法
  5. js逆向-猿人学(7-8)动态字体-图文点选
  6. javascript实现简单的收藏功能
  7. 直击2019云栖大会,袋鼠云分享新零售数据中台搭建五步法
  8. python requests下载图片_python读取图片大小Python Requests模块快速入门
  9. PTA 习题6.2 写字母* (10分)
  10. 【正版】2021年微信公众号外卖cps|外卖红包优惠券带好友返利佣金系统项目网站源码