Что может быть хорошим способом получения обновлений для SQL Server в режиме реального времени?

Давайте перепишем ваш код следующим образом:

x = 1
y = [x]
z = y * 4

myList = [z] * 3

После этого запустите следующий код, чтобы сделать все более понятным. Что делает код, в основном печатает id s полученных объектов, которые

Вернуть «идентификатор» объекта

и поможет нам идентифицировать их и проанализировать, что происходит:

print("myList:")
for i, subList in enumerate(myList):
    print("\t[{}]: {}".format(i, id(subList)))
    for j, elem in enumerate(subList):
        print("\t\t[{}]: {}".format(j, id(elem)))

И вы получите следующий результат:

x: 1
y: [1]
z: [1, 1, 1, 1]
myList:
    [0]: 4300763792
        [0]: 4298171528
        [1]: 4298171528
        [2]: 4298171528
        [3]: 4298171528
    [1]: 4300763792
        [0]: 4298171528
        [1]: 4298171528
        [2]: 4298171528
        [3]: 4298171528
    [2]: 4300763792
        [0]: 4298171528
        [1]: 4298171528
        [2]: 4298171528
        [3]: 4298171528

Итак, теперь давайте шаг за шагом. У вас есть x, который является 1, и единственным списком элементов y, содержащим x. Ваш первый шаг - y * 4, который даст вам новый список z, который в основном [x, x, x, x], т. Е. Создает новый список, который будет содержать 4 элемента, которые являются ссылками на исходный объект x. Чистый шаг очень похож. В основном вы делаете z * 3, который является [[x, x, x, x]] * 3 и возвращает [[x, x, x, x], [x, x, x, x], [x, x, x, x]] по той же причине, что и для первого шага.

0
задан codeBarer 24 March 2019 в 04:50
поделиться

2 ответа

Использовать триггеры

Создать SQL Server & amp; Таблицы Postgresql:

-- 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"
)

Создайте связанный сервер в SQL Server с вашим сервером Postgresql.

Затем создайте триггеры в своей таблице SQL Server:

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

Тест:

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

Триггер в этом примере обрабатывает пакет вставки и обновления. Это единственная настоящая ошибка с триггерами - при условии, что в «вставленной» таблице есть только одна запись. После массовой вставки или обновления вставленная таблица заполняется всеми новыми / измененными записями.

0
ответ дан Max Szczurek 24 March 2019 в 04:50
поделиться

Если вы хотите пойти по пути Kafka, есть несколько вариантов получения данных из SQL Server в Kafka:

Однажды данные в Kafka вы можете передать в Postgres (или любую другую базу данных), используя приемник kafka-connect-jdbc .

0
ответ дан Robin Moffatt 24 March 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: