如今江湖上最卷的门派,非国产数据库莫属。各位大侠们往往把精力放在拼内功(内核/架构)、拼身法(性能)、拼拳脚(功能/兼容性)、拼江湖地位(生态/社区)。然而好像并不怎么重视兵(武)器(接口/驱动/api),当然,可能我是搞c/c 出身,也许搞java的兄弟并不会遇到这样的困惑,因为一套jdbc可以打遍天下。虽然市场占有率的头把交椅java已经做了很多年,但随着各种开发语言的大行其道,现代企业的信息化系统中不太可能只使用单一的开发语言。因此闯荡江湖还是需要几把趁手的兵器!
本文以古龙先生的《七种武器》和武器的寓意作为类比,简单分析mogdb各种驱动的优势与应用场景。
七种武器分别是:长生剑——寓意“笑”;孔雀翎——寓意“自信”;碧玉刀——寓意“诚实”;多情环——寓意“仇恨”;霸王枪——寓意“勇气”;离别钩——寓意“团聚”;箱子——寓意“道”;
当然,《七种武器》与mogdb驱动的类比并非那么贴切,甚至有些牵强。如果各位大侠有不同见解欢迎留言评论,一起切磋mogdb的“道”。
天上白玉京 五楼十二城 仙人抚我顶 结发授长生。
长生剑!江湖中最可怕的一把剑。他只有杀人,从没有人能杀死他!长生剑的讲的是“笑”——“无论多锋利的剑,也比不上那动人的一笑。一个人只要懂得利用自己的长处,根本不必用武功也一样能够将人击倒”。
“笑”对于每个人来说再简单不过了,是每个人都能利用的一件武器。和笑一样简单的开发语言那当属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", "米乐app官网下载 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更贴近普通人的舒适工作区。
孔雀翎是早已不存在的暗器,高立向朋友秋凤梧借来孔雀翎,信心十足地杀了强敌,这才发现孔雀翎已丢失。而秋凤梧告诉他,孔雀翎早就没有了,他借给高立的只是“信心”。“真正的胜利,并不是你用武器争取的,一定要用你的信心。无论多可怕的武器,也比不上人的信心。”
前些年有这样一个梗,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可能鲜有人知,甚至使用它的就更少了,但如果能够解开它背后的秘密或许会变成“富可敌国的武林高手”。也许大家已经猜到它背后的秘密就是——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
#include
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是年轻充满朝气的开发语言,它诞生于2007年,发布与2009年,自发布以来,披荆斩棘,一时间搅得江湖上不得安宁。golang以编译型语言的姿态挑战c的性能,以轻量级的携程挑战java和c 的并发,从日志处理、运维监控,到虚拟机、容器、区块链等后端,再到代理、web应用、api应用,凭着这股“勇气”,在各个领域go都有上佳表现。
golang pq对于postgresql系的数据库有着非常重要的作用,不仅仅是在企业应用中,在mogdb的周边工具(如mtk等)开发中,这杆“霸王枪”也发发挥了重要作用,也许日后mogdb的监控和运维工具也会有golang pq的一席之地。
对于golang 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 string
err = 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就像横空出世的霸王枪,凭借着“勇气”已经撼动了不少企业级的java和c/c 应用,一些企业的核心系统已经逐渐的开始向golang转型。随着应用架构的不断演进,mogdb想在江湖上保持竞争力,一定要紧握golang pq这杆抢。
多情自古空余恨,好梦由来最易醒。岂是拈花难解脱,可怜飞絮太飘零。
想必大家还记得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
秘籍
江湖
对java我们有着复杂的感情,国内有着最多的java程序员群体,甚至可以用“过剩”这个词。对于jdk来说,虽然国内像阿里、华为这样的大厂已经有了jdk的产品,但尚未成熟,需要社区继续努力和生态的支撑。mogdb作为基于opengauss的企业级数据库,严格说也属于华为鲲鹏生态的一部分,华为有着完备的全栈生态体系,从kunpeng 处理器、openeuler操作系统、opengauss/gaussdb数据库到毕昇编译器,毕昇jdk。在it技术垂直领域几乎面面俱到。mogdb是华为数据库生态领域的水平拓展,既享受着生态的红利,又是生态建设的主要力量——恩墨对opengauss社区的贡献仅次于华为。
“你为什么要用如此残酷的武器?”“因为我不愿被人强迫与我所爱的人离别。”……“你用离别钩,只不过为了要相聚。”
说起odbc,一些早年的程序员会比较熟悉,但现在似乎渐渐的与我们“离别”,jdbc也是复用了odbc的思想后大行其道,但由于原生的数据库c/c 接口从性能到兼容性上表现的更为出色,而c/c 往往追求的恰恰是性能,所以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.gz
export 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
#include
#include
#ifdef win32
#include
#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是和内核代码放在一起,所以说它并非武器,而是“道”是postgresql的“道”也是opengauss/mogdb的“道”。
功法
- 安装
获取
- 范例
/*
* testlibpq.c
*/
#include
#include
#include
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];
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_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的拳脚功夫 。