Это реализация инкрементной синхронизации таблиц MySQL с одинаковыми полями.
В каждой таблице, которая требует синхронизации, должен быть столбец update_time
— время обновления (имя может отличаться, но тип должен быть связан со временем), который используется для получения самых свежих данных на основе времени обновления.
Этот столбец должен автоматически обновляться до текущего значения временной метки при обновлении данных, чтобы записывать время обновления данных.
Например, можно использовать настройку поля:
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Можно получить самые свежие данные из одной таблицы пакетами. Метод выглядит следующим образом:
func DoFetch(db SQLCommon, tableName string, options FetchOptions) (FetchResult, error)
Параметры:
db
: дескриптор операции с базой данных.tableName
: имя таблицы.options
: информация о конфигурации во время получения, формат FetchOptions
следующий:
IgnoreFields
: имена столбцов, которые нужно игнорировать при получении данных; результат получения данных не будет содержать этот столбец.PageNumber
: номер страницы для получения инкрементных данных, начиная с 1.PageSize
: размер страницы для получения инкрементных данных; чтобы определить, завершена ли разбивка на страницы, достаточно проверить, меньше ли количество полученных результатов размера страницы.UpdateTimeFieldName
: имя столбца, содержащего поле времени обновления (update_time
), описанное выше.LastUpdateTime
: временная метка последнего обновления; если она равна 0, то будут получены все данные; в противном случае будут получены данные, начиная с указанной временной метки.WhereSqlStmt
: пользовательский оператор SQL WHERE
, связанный с условием времени обновления ([UpdateTimeFieldName] > ?
), который имеет отношение AND
.WhereSqlArgs
: список параметров пользовательского оператора SQL WHERE
.Результат получения — структура FetchResult
:
columns
: список имён столбцов.data
: самые свежие данные, двумерный массив, каждая строка представляет собой запись, а значения внутри соответствуют именам столбцов один к одному.count
: количество данных.Примечание: столбцы типа времени будут преобразованы в временные метки при получении, что позволяет сэкономить место для хранения данных.
Интерфейс:
func DoUpdateOne(db SQLCommon, tableName string, data []interface{}, options UpdateOptions) error
Параметры:
db
: дескриптор операции с базой данных.tableName
: имя таблицы.data
: одна запись данных, значения которой соответствуют options.Columns
один к одному.options
: конфигурация вставки, формат UpdateOptions
следующий:
Columns
: список имён столбцов, соответствующий результату DoFetch
.TimeFields
: список имён столбцов типа time.Time
.FixedFields
: фиксированные столбцы для вставки, поскольку некоторые столбцы могут быть настроены на игнорирование в DoFetch
, поэтому здесь можно задать значения для этих столбцов.UniqueFields
: список имён уникальных или первичных ключей; при сбое операции вставки обновление не затрагивает уникальные или первичные ключи.SqlType
: тип базы данных, в настоящее время поддерживаются MySQL и SQLite.Данный интерфейс не возвращает значение.
Вставка или обновление выполняется с помощью оператора SQL вида INSERT INTO ... VALUES (...) ON DUPLICATE KEY UPDATE ...
. Причина отказа от использования REPLACE INTO
заключается в том, что его обновление сначала удаляет старые данные, а затем вставляет новые, что может привести к изменению некоторых игнорируемых полей.
Интерфейс:
func DoUpdate(db SQLCommon, tableName string, data [][]interface{}, options UpdateMultiOptions) error
По сравнению с интерфейсом вставки одной строки обновлённых данных, данные становятся двумерным массивом, а в options
добавляется ещё одна конфигурация:
BatchCount
: количество строк для пакетной вставки за раз, используется для ускорения выполнения операций вставки или обновления.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )