Как определить первичный ключ таблицы в postgres с C ++ и libpqxx? - PullRequest
0 голосов
/ 16 мая 2019

Моя задача - определить первичный ключ таблицы postgres с помощью libpqxx (динамически), но я не знаю, как правильно связать значение. Я получаю синтаксическую ошибку.

std::string sql =
           "SELECT c.column_name, c.data_type "\
            "FROM information_schema.table_constraints tc" 
            "JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)" 
            "JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema "
            "AND tc.table_name = c.table_name AND ccu.column_name = c.column_name "
            "WHERE constraint_type = 'PRIMARY KEY' and tc.table_name = '$1';";


     C->prepare("determine_primary_key", sql.c_str()); 

     pqxx::prepare::invocation  w_invocation = W->prepared("determine_primary_key");


    std::vector<std::string > vect;

    vect.push_back("postgres_table_name");

    prep_dynamic(vect, w_invocation);

    pqxx::result r = w_invocation.exec();

1 Ответ

0 голосов
/ 06 июля 2019

Из документации для pqxx метод prepared() устарел. Поэтому, используя ваш фрагмент кода, я внесу следующие изменения, чтобы использовать новый оператор exec_prepared(), и получу ваш параметр:

std::string sql =
       "SELECT c.column_name, c.data_type "\
        "FROM information_schema.table_constraints tc" 
        "JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)" 
        "JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema "
        "AND tc.table_name = c.table_name AND ccu.column_name = c.column_name "
        "WHERE constraint_type = 'PRIMARY KEY' and tc.table_name = '$1';";


 C->prepare("determine_primary_key", sql.c_str()); 

 pqxx::result r = W->exec_prepared("determine_primary_key", "<your_table_name_here>");

Но, если вы все еще используете старую версию pqxx и вам необходимо продолжать использовать prepared(), вы можете сделать следующее:

std::string sql =
       "SELECT c.column_name, c.data_type "\
        "FROM information_schema.table_constraints tc" 
        "JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)" 
        "JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema "
        "AND tc.table_name = c.table_name AND ccu.column_name = c.column_name "
        "WHERE constraint_type = 'PRIMARY KEY' and tc.table_name = '$1';";

 C->prepare("determine_primary_key", sql.c_str()); 

 pqxx::result r = W->prepared("determine_primary_key")("<your_table_name_here>").exec();

Вы можете проверить документацию libpqxx , чтобы получить больше информации о prepared() и exec_prepared().

...