Как выполнить IN в sql-запросе, используя pqxx в С++ для postgresql?

Как выполнить IN в sql-запросе, используя pqxx в c++ для postgresql? У меня есть vector<long> идентификаторов, и мне нужно обновить каждую строку в таблице студентов (чтобы установить faculty_id в какое-то новое значение). Я хочу избежать цикла, новое значение (faculty_id) я получаю, когда вставляю факультет с оператором prepared INSERT. Возможно ли вообще передать такую ​​итерируемую структуру или создать запрос prepared IN с использованием pqxx?

void prepareChangeFaculty(connection_base &c){
    const std::string sql =
      "UPDATE students SET faculty_id=$2 WHERE id IN $1"; // here is a problem
    c.prepare("change_faculty", sql);
}

$1 у меня есть вектор идентификаторов строк, которые мне нужно обновить


person Damir    schedule 26.05.2014    source источник
comment
Пожалуйста, предоставьте код.   -  person Alexandros    schedule 26.05.2014
comment
@Alexandros Я добавил код с проблемной частью   -  person Damir    schedule 26.05.2014


Ответы (2)


Почему бы не что-то подобное (Как объединить std::string и int? ) в С++ 11

string a="";
for (int k=0;k<myVector.size();k++){
    a += string(myVector[k]);
    if (k<myVector.size()-1){
        a += ",";
    }
}

std::string sql = "UPDATE students SET faculty_id=$2 WHERE id IN (" + a + ")";
person Alexandros    schedule 26.05.2014
comment
Вопрос: почему бы и нет? A: потому что SQL-инъекция! (Да, я знаю, что в myVector будут только целые числа; по крайней мере, на этой итерации разработки...) - person Massa; 26.05.2014
comment
@Massa ОП нигде не говорит, что это приложение будет использоваться другими пользователями, кроме него, так о какой SQL-инъекции вы говорите, когда это его сервер БД и его приложение? - person Alexandros; 26.05.2014
comment
Я принципиально не делаю SQL-инъекций (если могу их избежать). Как я уже сказал, я знаю, что myVectors — это целочисленный вектор (в него трудно вводить вредоносные данные) на данный момент. Парень, который унаследует код, может изменить его на string вектор или boost::variant запись, а следующий парень в очереди с тем же кодом через пять лет превратит код в библиотеку и свяжет его с веб-службой, и в этом нет никакой необходимости. бюджета, чтобы сделать надлежащую проверку кода, и продукт должен быть запущен как можно скорее и БАМ!.... - person Massa; 26.05.2014
comment
Тогда давайте напишем весь код таким образом, чтобы тупые обезьяны не могли БАМ во всех возможных вариантах будущего ... лол - person knivil; 27.05.2014

Я понимаю опасения @Massa, однако я не смог найти другого решения, кроме решения @Alexandros.

Итак, небольшим улучшением этого решения может быть использование std::copy

std::stringstream params;

std::copy(
    myVector.begin(), myVector.end(),
    std::ostream_iterator<std::string>(params, ","));

std::string sql = "UPDATE students SET faculty_id=$2 WHERE id IN ('"
    + params.str() + "')";
person campisano    schedule 05.08.2020