如今江湖上最卷的门派,非国产数据库莫属。各位大侠们每每把精力放在拼内功(内核/架构)、拼身法(性能)、拼拳脚(功能/兼容性)、拼江湖地位(生态/社区)。然而彷佛并不怎么重视兵(武)器(接口/驱动/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/
验证
$ python3Python 3.7.9 (default, Jan 25 2022, 15:12:36)[GCC 7.3.0] on linuxType "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/libpqxxgit checkout 6.4./configure --disable-documentationmake -j8make check -j 8make 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 = salary2"); 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.outg++ main.cpp -lpqxx -lpq -L/home/frank/pgsql/libexport PGDATABASE=postgresexport PGHOST=localhostexport PGPORT=15432export PGUSER=frankexport PGPASSWORD=frank@123psql -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.shpsql: warning: extra command-line argument "frank@123" ignoredPassword:DROP TABLECREATE TABLEINSERT 0 1Connected to postgresFound 1employees:frankDoubling 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 textgit clone https://github.com/golang/crypto.git cryptogo install textgo install crypto
范例
package mainimport ( "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 string err = db.QueryRow("select version()").Scan(&version) if err != nil { log.Fatal(err) } fmt.Println(version)}
验证
frank@DESKTOP-6NF3B9K:~/test/go/src$ lltotal 7480drwxr-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.gofrank@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-bitfrank@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的产品,但在我们弘大系统等分散着太多的组件,须要全面的兼容性评估——岂是拈花难解脱,可怜飞絮太飘零。
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 JdbcDemoSystem.out.println(rs.getString(1));Aug 06, 2022 10:24:12 AM org.opengauss.core.v3.ConnectionFactoryImpl openConnectionImplINFO: [11a01b6b-3b51-4549-b552-6f836646ef36] Try to connect. IP: localhost:15432Aug 06, 2022 10:24:12 AM org.opengauss.core.v3.ConnectionFactoryImpl openConnectionImplINFO: [127.0.0.1:39218/ocalhost/127.0.0.1:15432] Connection is established. ID: 11a01b6b-3b51-4549-b552-6f836646ef36Aug 06, 2022 10:24:12 AM org.opengauss.core.v3.ConnectionFactoryImpl openConnectionImplINFO: Connect complete. ID: 11a01b6b-3b51-4549-b552-6f836646ef36Version : (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.gzcd unixODBC-2.3.7pre./configuremake -j6sudo make installtar -zxvf openGauss-3.0.0-ODBC.tar.gzexport ODBCSYSINI=/usr/local/etcexport ODBCINI=/usr/local/etc/odbc.iniexport 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.sosetup=/home/frank/test/odbc/odbc/lib/psqlodbcw.so
/usr/local/etc/odbc.ini
# /usr/local/etc/odbc.ini[MOGODBC]Driver=GaussMPPServername=localhostDatabase=postgresUsername=frankPassword=frank@123Port=15432Sslmode=disablefrank@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 11 rows fetchedSQL>
范例
// 此示例演示如何通过ODBC办法获取MogDB中的数据。// DBtest.c (compile with: libodbc.so)#include <stdlib.h>#include <stdio.h>#include <sqlext.h>#ifdef WIN32#include <windows.h>#endifSQLHENV V_OD_Env; // Handle ODBC environmentSQLHSTMT V_OD_hstmt; // Handle statementSQLHDBC V_OD_hdbc; // Handle connectionchar 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 -wfrank@DESKTOP-6NF3B9K:~/test/odbc$ ./mainConnected !SQLColAtrributeDone !
秘籍
看了网上的一些文档综合比下来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 voidexit_nicely(PGconn conn){ PQfinish(conn); exit(1);}intmain(int argc, char argv){ const char conninfo; PGconn conn; PGresult res; int nFields; int i,j; / 用户在命令行上供应了conninfo字符串的值时利用该值 否则环境变量或者所有其它连接参数 都利用缺省值。 / if (argc > 1) conninfo = argv[1]; else conninfo = "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_PATHgcc 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的拳脚功夫。