【问题标题】:libbqxx C++ API to connect to PostgreSQL without DB namelibbqxx C++ API 连接到没有数据库名称的 PostgreSQL
【发布时间】:2018-03-06 02:07:55
【问题描述】:

我使用 PostgreSQL 的 libpqxx C++ 客户端 API 作为 cockroachDB 的驱动程序。来自 cockroachDB 文档:

pqxx::connection c("postgresql://maxroach@localhost:26257/bank")

这需要用户和数据库作为前提条件。是否有任何 C++ API 可以将其分为如下两个步骤?

1) First connect just with user.
2) create data base.

我已经尝试了下面的代码,但它失败了,因为它需要 root 用户 特权。

void roachDB::createDB(const string &dbName)
{
    pqxx::nontransaction w(roachDBconn);
    w.exec("CREATE DATABASE " + dbName);
    w.commit();
}

感谢您的帮助!

======= Edit 1 : Working code based on @clemens tip ===========

void roachDB::createDB(const string &dbName, const string &user)
{
    pqxx::connection c("postgresql://root@localhost:26257/template1");
    pqxx::nontransaction w(c);
    try {
        w.exec("CREATE DATABASE " + dbName);
    } catch (pqxx::sql_error &e) {
        string sqlErrCode = e.sqlstate();
        if (sqlErrCode == "42P04") { // catch duplicate_database
            cout << "Database: " << dbName << " exists, proceeding further\n";
            c.disconnect();
            return;
        }
        std::cerr << "Database error: " << e.what()
            << ", error code: " << e.sqlstate()
            << "SQL Query was: " << e.query() << "\n";
        abort();
    }
    w.exec("GRANT ALL ON DATABASE " + dbName + " TO " + user);
    w.commit();
    c.disconnect();
}

【问题讨论】:

    标签: postgresql libpqxx cockroachdb


    【解决方案1】:

    不指定数据库就无法连接到 Postgres 服务器。但是总是有数据库template1,您可以将其用于您的目的。所以,联系

    pqxx::connection c("postgresql://maxroach@localhost:26257/template1")
    

    并使用该连接创建新数据库。

    您还应该授予maxroach 创建数据库的权限:

    GRANT CREATE DATABASE TO maxroach;
    

    但这必须由具有超级用户权限的数据库用户执行(例如postgres)。

    【讨论】:

    • 是否可以创建一个不同于“maxroach”的用户并授予其所有权限并使用它来创建数据库? maxroach 是一个特殊的词吗?
    • Maxroach 只是一个用户名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2019-02-19
    • 2014-03-04
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多