Вставка данных функции postgresql с помощью python - PullRequest
1 голос
/ 26 марта 2019

мои значения

user = [[34, 'Victoria', '17:34:50', None], [40, 'Meherin', '00:04:00', '23:56:10'], [30, 'Micahle', '18:58:43', None]]

У меня есть функция postgresql с именем merge_db (), и она принимает 4 аргумента. Теперь я хочу вставить значение от пользователя с Python.

Функция postgresql.

CREATE FUNCTION merge_db(id1 integer, name1 character varying, login1 time, logout1 time) RETURNS VOID AS
$$
BEGIN
    LOOP
        -- first try to update the id
        UPDATE my_company SET (name, login, logout) = (name1, login1, logout1) WHERE id = id1;
        IF found THEN
            RETURN;
        END IF;
        -- not there, so try to insert the key
        -- if someone else inserts the same key concurrently,
        -- we could get a unique-key failure
        BEGIN
            INSERT INTO my_company(id, name, login, logout) VALUES (id1, name1, login1, logout1);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- Do nothing, and loop to try the UPDATE again.
        END;
    END LOOP;
END;
$$
LANGUAGE plpgsql;

мой код Python, такой как

insert_query = "SELECT merge_db(%s) values %s"
execute_values(cur, insert_query, user)
conn.commit()

В этом случае выдается ValueError "ValueError: запрос содержит несколько заполнителей"% s ""

Я не совсем понимаю, как отправить пользовательские значения в качестве аргумента merger_db.

Любая помощь будет оценена. Спасибо.

1 Ответ

0 голосов
/ 27 марта 2019
for i in user:
        print(i[0], i[1], i[2], i[3], )
        insert_query = "SELECT merge_db({}, '{}', '{}', '{}')".format(i[0], i[1], i[2], i[3]
cur.execute(insert_query)

Это будет хорошо работать, но вызовет ошибку дублирования ключа.

...