0

我正在尝试监视 postgres 数据库中的表。

我想将此表上的每个操作(插入或更新或删除)发送到 python tcp 服务器。

所以我尝试按照 本教程进行操作,但没有成功。

这是我正在使用的 SQL 脚本:

CREATE LANGUAGE plpython3u;
CREATE OR REPLACE FUNCTION public.sendsocket(msg character varying, host character varying, port integer)
  RETURNS integer AS
$BODY$
  import _socket
  try:
    s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
    s.connect((host, port))
    s.sendall(msg)
    s.close()
    return 1
  except:
    return 0
$BODY$
  LANGUAGE plpython3u VOLATILE
  COST 100;
ALTER FUNCTION public.sendsocket(character varying, character varying, integer)
  OWNER TO keycloak;

CREATE OR REPLACE FUNCTION public.myTriggerToSendSockets()
RETURNS trigger AS
$BODY$
   import json
   stmt = plpy.prepare("select public.sendSocket($1, $2, $3)", ["text", "text", "int"])
   rv = plpy.execute(stmt, [json.dumps(TD), "myserver", 8881])
$BODY$
LANGUAGE plpython3u VOLATILE
COST 100;


CREATE TRIGGER myTrigger2
  AFTER INSERT OR UPDATE OR DELETE
  ON event_entity
  FOR EACH ROW
  EXECUTE PROCEDURE public.myTriggerToSendSockets();

我正在使用一个简单的 python TCP 服务器来接收数据并简单地打印它:

import socket

# Create a socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Ensure that you can restart your server quickly when it terminates
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Set the client socket's TCP "well-known port" number
well_known_port = 8881
sock.bind(('', well_known_port))

# Set the number of clients waiting for connection that can be queued
sock.listen(5)

# loop waiting for connections (terminate with Ctrl-C)
try:
    while 1:
        newSocket, address = sock.accept(  )
        print ("Connected from", address)
        # loop serving the new client
        while 1:
            receivedData = newSocket.recv(1024)
            print(receivedData)
            if not receivedData: break     
        newSocket.close(  )

finally:
    sock.close(  )

我希望在此表上获得插入的事务,但是当我执行操作时,event_entity我收到一条空消息:

Connected from ('172.29.0.3', 56326)
b''

我相信 TD 对象json.dumps(TD)是空的。有人可以帮忙解决这个问题吗?

4

1 回答 1

0

在发送消息之前,我必须将消息编码为字节:

s.sendall(msg.encode())
于 2020-03-16T14:51:39.087 回答