当前位置: 首页 > 编程笔记 >

postgresql 使用C-API访问PostgreSQL

嵇星海
2023-03-14
本文向大家介绍postgresql 使用C-API访问PostgreSQL,包括了postgresql 使用C-API访问PostgreSQL的使用技巧和注意事项,需要的朋友参考一下

示例

C-API是访问PostgreSQL的最强大的方法,令人惊讶的舒适。

编译和链接

在编译期间,您必须将PostgreSQL包含目录(可以通过找到)添加pg_config --includedir到包含路径。
您必须与PostgreSQL客户端共享库链接(libpq.so在UNIX上,libpq.dll在Windows上)。该库位于PostgreSQL库目录中,可通过找到pg_config --libdir。

注意:由于历史原因,该库被称为libpq.so而不是 libpg.so,这对于初学者来说是一个流行的陷阱。

鉴于以下代码示例位于file中coltype.c,将使用以下命令完成编译和链接

gcc -Wall -I "$(pg_config --includedir)" -L "$(pg_config --libdir)" -o coltypecoltype.c-lpq

使用GNU C编译器(考虑添加-Wl,-rpath,"$(pg_config --libdir)"以添加库搜索路径)或

cl /MT /W4 /I <include directory>coltype.c<path to libpq.lib>

在Windows上使用Microsoft VisualC。

样例程序

/* necessary for all PostgreSQL client programs, should be first */
#include <libpq-fe.h>

#include <stdio.h>
#include <string.h>

#ifdef TRACE
#define TRACEFILE "trace.out"
#endif

int main(int argc, char **argv) {
#ifdef TRACE
    FILE *trc;
#endif
    PGconn *conn;
    PGresult *res;
    int rowcount, colcount, i, j, firstcol;
    /* parameter type should be guessed by PostgreSQL */
    const Oid paramTypes[1] = { 0 };
    /* parameter value */
    const char * const paramValues[1] = { "pg_database" };

    /*
     * Using an empty connectstring will use default values for everything.
     * If set, the environment variables PGHOST, PGDATABASE, PGPORT and
     * PGUSER will be used.
     */
    conn = PQconnectdb("");

    /*
     * This can only happen if there is not enough memory
     * to allocate the PGconn structure.
     */
    if (conn == NULL)
    {
        fprintf(stderr, "Out of memory connecting to PostgreSQL.\n");
        return 1;
    }

    /* check if the connection attempt worked */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "%s\n", PQerrorMessage(conn));
        /*
         * Even if the connection failed, the PGconn structure has been
         * allocated and must be freed.
         */
        PQfinish(conn);
        return 1;
    }

#ifdef TRACE
    if (NULL == (trc = fopen(TRACEFILE, "w")))
    {
        fprintf(stderr, "Error opening trace file \"%s\"!\n", TRACEFILE);
        PQfinish(conn);
        return 1;
    }

    /* tracing for client-server communication */
    PQtrace(conn, trc);
#endif

    /* this program expects the database to return data in UTF-8 */
    PQsetClientEncoding(conn, "UTF8");

    /* perform a query with parameters */
    res = PQexecParams(
        conn,
        "SELECT column_name, data_type "
            "FROM information_schema.columns "
            "WHERE table_name = $1",
        1,            /* one parameter */
        paramTypes,        
        paramValues,
        NULL,        /* parameter lengths are not required for strings */
        NULL,        /* all parameters are in text format */
        0            /* result shall be in text format */
    );

    /* out of memory or sever communication broken */
    if (NULL == res)
    {
        fprintf(stderr, "%s\n", PQerrorMessage(conn));
        PQfinish(conn);
#ifdef TRACE
        fclose(trc);
#endif
        return 1;
    }

    /* SQL statement should return results */
    if (PGRES_TUPLES_OK != PQresultStatus(res))
    {
        fprintf(stderr, "%s\n", PQerrorMessage(conn));
        PQfinish(conn);
#ifdef TRACE
        fclose(trc);
#endif
        return 1;
    }

    /* get count of result rows and columns */
    rowcount = PQntuples(res);
    colcount = PQnfields(res);

    /* print column headings */
    firstcol = 1;

    printf("Description of the table \"pg_database\"\n");

    for (j=0; j<colcount; ++j)
    {
        if (firstcol)
            firstcol = 0;
        else
            printf(": ");

        printf(PQfname(res, j));
    }

    printf("\n\n");

    /* loop through rosult rows */
    for (i=0; i<rowcount; ++i)
    {
        /* print all column data */
        firstcol = 1;

        for (j=0; j<colcount; ++j)
        {
            if (firstcol)
                firstcol = 0;
            else
                printf(": ");

            printf(PQgetvalue(res, i, j));
        }

        printf("\n");
    }

    /* this must be done after every statement to avoid memory leaks */
    PQclear(res);
    /* close the database connection and release memory */
    PQfinish(conn);
#ifdef TRACE
    fclose(trc);
#endif
    return 0;
}
           

 类似资料:
  • 本文向大家介绍postgresql 使用Npgsql提供程序从.NET访问Postgresql,包括了postgresql 使用Npgsql提供程序从.NET访问Postgresql的使用技巧和注意事项,需要的朋友参考一下 示例 Npgsql是Postgresql最受欢迎的.NET提供程序之一,它ADO.NET兼容并且与其他.NET数据库提供程序几乎相同地使用。 典型的查询是通过创建命令,绑定参数

  • 这表明Docker postgresql(正在运行)在该端口不可用。我尝试将添加到我的中,但没有成功。有什么提示吗?

  • 问题内容: 我正在尝试使用访存api来带回一些数据,但是一旦检索到它就无法将其映射到控制台。 我得到的错误是 response.map不是函数 所以我试图解析响应(即var data = JSON.parse),该响应不起作用,并显示错误 有趣的是,当对XMLHttp请求执行相同操作时,需要解析它,因此我也想知道为什么这两种检索数据方法之间的区别。 如果有人能指出正确的方向,我将不胜感激。 问题答

  • 我在干什么? 步骤1-启用邻近API: 为了使用接近API,它必须首先在谷歌开发控制台中启用。使用本教程,我为我的项目启用了对邻近API的支持 步骤2-获取凭据: 根据本教程,我需要得到客户端ID和秘密。这就是我困惑的地方。凭据->添加凭据->OAuth2.0客户端ID->选择Chrome App单选按钮(因为我使用的是Postman)->输入Postman的Chrome Web store UR

  • 我试图直接访问Kubernetes API,而不运行。但是当我使用serviceaccount默认值的令牌时,我得到一个403。即使在为此serviceaccount创建了ClusterRole和ClusterRoleBinding之后,请求也会被拒绝403。 我应用的配置如下所示: (它几乎是来自kubernetes io上的文档,只是使用了ServiceAccount作为主题,并将资源更改为p

  • 我正在尝试使用postman对firebase进行RESTAPI调用。当我的安全规则是允许所有用户,包括未经授权的用户时,我已经设法从firebase读取。 但当我使用这个规则时: 我从邮递员那里得到“错误”:“许可被拒绝”。我为谷歌的web oauth2.0客户端做了请求令牌,并拿回了authorization_code令牌。 我试图在URL和标题中使用令牌,用GET尝试过 请帮忙。提前谢谢