我想从各种语言连接到PostgreSQL

本文是 PostgreSQL Advent Calendar 2015 的第4天。第3天的贡献者是 kasa_zip。

近年來,數據分析領域非常繁榮。如果規模很大,可能需要使用Spark/Hadoop等技術,但在某種程度上,關系型數據庫就足夠應對了。特別是PostgreSQL,它的JSON支持非常豐富,所以在中小規模的分析基礎設施上應該是足夠的。

因此,我們將整理各種語言的PostgreSQL連接驅動程序和模塊。
由於我們沒有太多涉足其他語言,所以除了Java和Python之外可能不夠充實…

针对Java情况下

因为提供了PostgreSQL JDBC驱动程序,所以请使用它进行下载。

jdbc.png

选择使用JDBC驱动程序时,应该根据执行环境的JDK版本进行选择。例如,如果使用JDK 1.8,则需要使用JDBC42驱动程序,因此可以使用9.4构建1202-1206中的任何一个。PostgreSQL的通信协议从7.4版本开始是共同的,因此即使使用9.4的驱动程序连接到7.4或更高版本的PostgreSQL也没有任何问题。您只需使用与所使用的JDK兼容的最新驱动程序即可。

此外,由于PostgreSQL的JDBC驱动程序是纯Java编写的,不需要libpq,因此只需将下载的驱动程序添加到CLASSPATH即可使其独立运行。

在Python中

jdbc1.png

尽管表中也提到了,但在Python中提供了多个驱动程序。可能我们经常听到的是以下的三个名称。

    • psycopg2:先月DL数(718640)

 

    • pg8000:先月DL数(46977)

 

    py-postgresql:先月DL数(3339)

查看DL数,可以看出pyscopg2非常突出。实际上,它也被广泛使用,并且支持Python2和Python3系列,因此非常方便易用。但是,psycopg2依赖于libpq,所以需要安装postgresql-devel等软件包。

一方面,pg8000和py-postgresql都是使用纯Python实现的,因此不需要libpq。从这个角度来看,它们的引入成本较低。但是请注意,pg8000仅支持Python 2系列,而py-postgresql仅支持Python 3系列。
* py-postgresql的下载数量较少可能也受到Python 3系列用户目前较少的影响。

如果是简单的工具,使用PurePython的驱动程序可能更容易,但考虑到稳定性等因素,使用psycopg2会更可靠。

另外,顺便说一下,在@snaga所公开的postgres-toolkit内部,实现了一个名为PsqlWrapper.py的库,可以通过psql发出SQL查询,并将标准输出解析为易于处理的形式。如果您个人想要创建一个轻量级的在PostgreSQL上处理数据的工具,也许这样的实现是一个选项之一。

对于Node.js的情况下

在使用Node.js连接PostgreSQL时,通常会使用node-postgres。这是一个纯JavaScript的实现,可以通过以下方式进行安装。

$ npm install pg

然而,node-postgres库中还有一个使用libpq的pg-native选项,但通常情况下似乎更常用的是pg选项。
在node-postgres中,结果以JSON格式返回。

[
    {
        "empno": "7369",
        "ename": "SMITH",
        "job": "CLERK",
        "mgr": "7902",
        "hiredate": "1980-12-17T00:00:00.000Z",
        "sal": "800.00",
        "comm": null,
        "deptno": "20"
    },
    {
        "empno": "7499",
        "ename": "ALLEN",
        "job": "SALESMAN",
        "mgr": "7698",
        "hiredate": "1981-02-20T00:00:00.000Z",
        "sal": "1600.00",
        "comm": "300.00",
        "deptno": "30"
    }
]

虽然这种形式相当直观,但9.1版本之后还增加了JSON类型和JSONB类型,它们能够将返回的结果作为JSON类型轻松地反馈出来。

sample_db=# create table json_test(json_col json);
CREATE TABLE
sample_db=# insert into json_test values('{"A":{"B":[1,2,3]}}'::json);
INSERT 0 1
sample_db=# insert into json_test values('{"C":{"D":[4,5]}}'::json);
INSERT 0 1

[
    {
        "json_col": {
            "A": {
                "B": [
                    1,
                    2,
                    3
                ]
            }
        }
    },
    {
        "json_col": {
            "C": {
                "D": [
                    4,
                    5
                ]
            }
        }
    }
]

在使用Node.js进行后端开发时,很多情况下会选择MongoDB,但是PostgreSQL也是非常适合Node.js的,不是吗?

在.NET Framework中

通过使用Npgsql,.NET也可以连接到PostgreSQL。可以通过Nuget获取Npgsql。Npgsql是纯C#编写的,不需要libpq。在Windows环境下,有时安装PostgreSQL可能会很麻烦,这是一个好消息。

由于ADO.NET的互换性,如果你以前在其他数据库中使用过ADO.NET,我认为你几乎可以毫无疑问地使用它。

顺便说一下,据说Mono也可以运行,但我没有尝试过…

如果是使用PHP的情况下

由于PHP提供了PostgreSQL函数,因此我们将使用它。请注意,要使用该函数,需要在编译时使用了–with-pgsql选项。另外,如果通过PDO使用,请确保使用了–with-pdo-pgsql选项。由于它依赖于libpq,所以需要单独安装一些包,如postgresql-devel。

你可以使用已经引入的PHP中的PostgreSQL函数或通过PDO通过来确认是否可以使用PostgreSQL。

此外,您也可以通过php-config来确认编译选项。

$ ./php-config --configure-options
--prefix=/home/sample/apps/php ...--with-pgsql=/home/sample/posgrehome --with-pdo-pgsql=/home/sample/posgrehome 

如果说到Ruby的话

Ruby似乎经常使用ruby-pg模块。由于它似乎是使用libpq进行实现的,因此需要额外安装postgresql-devel等软件包。

gem install pg

顺便提一句,在自行编译PostgreSQL并将其安装到与通常不同的目录中时,进行ruby-pg安装时可能会失败。此时,您可以按以下方式指定pg_config的路径。(手册中也有说明)

gem install pg -- --with-pg-config=<path to pg_config>

最后

我总结了关于在各种语言中使用PostgreSQL的讨论。由于主要语言都有相应的驱动程序,所以如果您还没有使用过PostgreSQL,我建议您尝试一下。

PostgreSQL Advent Calendar 2015的第五天由nuko_yokohama负责。

广告
将在 10 秒后关闭
bannerAds