Python psycopg2, выполняющий select pg_notify, не работает - PullRequest
0 голосов
/ 08 ноября 2018

Это мой самый первый вопрос в StackOverflow, поэтому, если я делаю что-то не так, пожалуйста, будьте осторожны.

Я борюсь с выполнением SELECT pg_notify из скрипта Python. Кажется, это не работает вообще.

Мой сервер NodeJS прослушивает канал 'testnotify' с помощью pg-обещания. Я ставлю это только для полноты, потому что это работает.

db.connect({direct: true})
.then(sco => {
    sco.client.on('notification', data => {
        console.log('Received:', data);
    });
    return sco.none('LISTEN $1~', 'testnotify');
})
.catch(error => {
    console.log('Error:', error);
});

Мой скрипт на Python должен выдавать уведомление после серии успешных операций с БД.

Я так делаю

conn = psycopg2.connect(conn_string)
cur = conn.cursor()
cur.execute("SELECT pg_notify('%s', '%s');" % ('testnotify', 'blabla'))

или тому подобное

query = "SELECT pg_notify('testnotify', 'blabla');"
print(query)
cur.execute(query)

Я пытался подобным образом с NOTIFY testnotify, 'blabla', и ничего не работает. Ничего не происходит на стороне NodeJS. Но когда я копирую результат print (query) из консоли Python и выполняю его непосредственно из PostgreSQL, тогда он работает как чудо. Я не понимаю, что не так с моим кодом.

Я использую psycopg2 2.7.5, PostgreSQL 10, Node 10 LTS, pg-обещание в Windows 10.

Примечание: это не проблема с Node, потому что он работает, когда pg_notify или notify вызываются с помощью триггера в исходной таблице в postgresql или при выполнении уведомления в виде обычного sql-запроса в db. Это не работает, только когда я пытаюсь поднять уведомление из скрипта Python.

После двух дней жонглирования этим я думаю, что это что-то очевидное и глупое, но я не вижу этого. А может быть, это просто невозможно ...

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 08 ноября 2018

О, боже ... я только что нашел решение ... даже два способа решить эту проблему.

Подсказка была в документации по psycopg ... очевидно, да?

чтобы отправить уведомление используя

cur.execute("SELECT pg_notify('%s', '%s');" % ('testnotify', 'blabla'))

необходимо установить соединение для автоматической отправки, как это

import psycopg2
import psycopg2.extensions
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)

или просто, если вы не хотите автокоммит, то после выполнения

cur.execute("SELECT pg_notify('%s', '%s');" % ('testnotify', 'blabla'))

Вы должны совершить это

conn.commit()

aa и теперь Node получает уведомления от postgresql через python

...