Давайте перепишем ваш код следующим образом:
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]]
по той же причине, что и для первого шага.
Использовать триггеры
Создать SQL Server & amp; Таблицы Postgresql:
blockquote>-- 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:
blockquote>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
Тест:
blockquote>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
Триггер в этом примере обрабатывает пакет вставки и обновления. Это единственная настоящая ошибка с триггерами - при условии, что в «вставленной» таблице есть только одна запись. После массовой вставки или обновления вставленная таблица заполняется всеми новыми / измененными записями.
Если вы хотите пойти по пути Kafka, есть несколько вариантов получения данных из SQL Server в Kafka:
Для CDC на основе журнала:
Для CDC на основе запросов:
Однажды данные в Kafka вы можете передать в Postgres (или любую другую базу данных), используя приемник kafka-connect-jdbc .