libbqxx C++ API 连接到没有数据库名称的 PostgreSQL
libbqxx C++ API to connect to PostgreSQL without DB name
我正在使用 libpqxx C++ 客户端 API for PostgreSQL 作为 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();
}
不指定数据库就无法连接到 Postgres 服务器。但是总有一个数据库 template1
可以供您使用。所以,联系
pqxx::connection c("postgresql://maxroach@localhost:26257/template1")
并使用该连接创建新数据库。
您还应该授予 maxroach
创建数据库的权限:
GRANT CREATE DATABASE TO maxroach;
但这必须由具有超级用户权限的数据库用户执行(例如postgres
)。
我正在使用 libpqxx C++ 客户端 API for PostgreSQL 作为 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();
}
不指定数据库就无法连接到 Postgres 服务器。但是总有一个数据库 template1
可以供您使用。所以,联系
pqxx::connection c("postgresql://maxroach@localhost:26257/template1")
并使用该连接创建新数据库。
您还应该授予 maxroach
创建数据库的权限:
GRANT CREATE DATABASE TO maxroach;
但这必须由具有超级用户权限的数据库用户执行(例如postgres
)。