python - 实时获取 SQL Server 更新的好方法是什么?

标签 python sql-server postgresql apache-kafka

每次对表执行插入或更新时,我都在尝试找到一种方法将数据从 SQL Server 2014 和 2017 中复制出来。我正在尝试实时将这些值插入到 PostgreSQL 中的另一个表中。我探索过的少数选项是使用以下工具进行批处理:

  • Talend ETL 工具

  • PostgreSQL 中使用 cron 作业触发的外部数据包装器 每小时对 PostgreSQL 表进行插入和更新的过程 使用 SQL Server 表中的数据。

我不确定如何从 SQL Server 实时获取事件,我可以链接到 Kafka 或什至 Python 微服务之类的东西,或者是否有更好的方法。

最佳答案

使用触发器

Create SQL Server & Postgresql tables:

-- SQL Server
create table test (id int identity(1,1) not null primary key, name varchar(25), description varchar(1000))
go

-- Postgresql:
CREATE TABLE public.test
(
    id integer,
    name character varying(25) COLLATE pg_catalog."default",
    description character varying(1000) COLLATE pg_catalog."default"
)

Create a linked server in SQL Server to your Postgresql server.

Then create triggers on your SQL Server table:

create trigger iu_trigger_name on test
after insert, update
as 
begin
    UPDATE [SQLAuth_PG].[DefaultDB].[public].[test]
    SET name = t.name, description = t.description
    FROM [SQLAuth_PG].[DefaultDB].[public].[test] p
    INNER JOIN inserted t ON p.id = t.id

    INSERT INTO [SQLAuth_PG].[DefaultDB].[public].[test]
           ([id]
           ,[name]
           ,[description])
    SELECT t.id, t.name, t.description
    FROM inserted t
    WHERE NOT EXISTS (
        SELECT * FROM [SQLAuth_PG].[DefaultDB].[public].[test] 
        WHERE id = t.id
    )
end
go

create trigger d_trigger_name on test
after delete 
as
begin
    delete p
    FROM [SQLAuth_PG].[DefaultDB].[public].[test] p
    inner join deleted d on p.id = d.id
end
go

Test:

insert into test (name, description) select 'Name1', 'Name 1 description'
go

select * from [SQLAuth_PG].[DefaultDB].[public].[test]

--output
--id    name    description
--1 Name1   Name 1 description

update test set description = 'Updated description!' where name = 'Name1'
go

select * from [SQLAuth_PG].[DefaultDB].[public].[test]

-- output
--id    name    description
--1 Name1   Updated description!

delete from test
go

select * from [SQLAuth_PG].[DefaultDB].[public].[test]
go

-- postgresql table is empty

此示例中的触发器处理批量插入和更新。这是触发器唯一真正的陷阱 - 假设“插入”表中只有一条记录。批量插入或更新后,插入的表将填充所有新的/修改的记录。

关于python - 实时获取 SQL Server 更新的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55320827/

相关文章:

python - 如何在 flask 响应中返回图像?

python - 使用递归查看随机列表时如何跟踪偶数的数量

mysql - 如何将两个 SQL 查询合并到一个查询中

sql-server - 如何使用Golang SDK查询RDS的任何表格

python - 我在 django 中不小心删除了我的 key 表单 settings.py

sql - 将参数与空值进行比较

postgresql - 如何通过 Node.js 连接到 Postgres

android - 通过 JDBC 连接到 PostgreSQL - NetworkOnMainThreadException

hibernate - setParameter() 没有设置正确的引号

python - 如何使用另一个命名元组列表附加到列表?