Documentation
¶
Overview ¶
Package postgres provides functionality for the TDTP framework.
Index ¶
- func BuildFieldFromPGColumn(name, dataType string, isNullable, isPK bool, defaultValue string) (packet.Field, error)
- func IsPostgreSQLReservedWord(word string) bool
- func ParsePostgreSQLType(pgType string) (baseType string, length, precision, scale int)
- func PostgreSQLToTDTP(pgType string) (schema.DataType, string, error)
- func QuoteIdentifier(identifier string) string
- func TDTPToPostgreSQL(field packet.Field) string
- func TDTPToPostgreSQLStrict(field packet.Field, strict bool) string
- type Adapter
- func (a *Adapter) BeginTx(ctx context.Context) (adapters.Tx, error)
- func (a *Adapter) Close(ctx context.Context) error
- func (a *Adapter) Connect(ctx context.Context, cfg adapters.Config) error
- func (a *Adapter) CreateTable(ctx context.Context, tableName string, pktSchema packet.Schema) error
- func (a *Adapter) DropTable(ctx context.Context, tableName string) error
- func (a *Adapter) Exec(ctx context.Context, sql string, args ...any) error
- func (a *Adapter) ExecuteRawQuery(ctx context.Context, query string) (*packet.DataPacket, error)
- func (a *Adapter) ExportTable(ctx context.Context, tableName string) ([]*packet.DataPacket, error)
- func (a *Adapter) ExportTableIncremental(ctx context.Context, tableName string, ...) ([]*packet.DataPacket, string, error)
- func (a *Adapter) ExportTableWithQuery(ctx context.Context, tableName string, query *packet.Query, ...) ([]*packet.DataPacket, error)
- func (a *Adapter) GetDatabaseType() string
- func (a *Adapter) GetDatabaseVersion(ctx context.Context) (string, error)
- func (a *Adapter) GetRowCount(ctx context.Context, tableName string) (int64, error)
- func (a *Adapter) GetSchemas(ctx context.Context) ([]string, error)
- func (a *Adapter) GetTableNames(ctx context.Context) ([]string, error)
- func (a *Adapter) GetTableSchema(ctx context.Context, tableName string) (packet.Schema, error)
- func (a *Adapter) GetViewNames(ctx context.Context) ([]adapters.ViewInfo, error)
- func (a *Adapter) ImportPacket(ctx context.Context, pkt *packet.DataPacket, strategy adapters.ImportStrategy) error
- func (a *Adapter) ImportPackets(ctx context.Context, packets []*packet.DataPacket, ...) error
- func (a *Adapter) InsertRows(ctx context.Context, tableName string, pktSchema packet.Schema, ...) error
- func (a *Adapter) InspectTable(ctx context.Context, tableName string) (*adapters.TableReport, error)
- func (a *Adapter) ParseFailures() []base.ParseFailure
- func (a *Adapter) Ping(ctx context.Context) error
- func (a *Adapter) Pool() *pgxpool.Pool
- func (a *Adapter) Query(ctx context.Context, sql string, args ...any) (pgx.Rows, error)
- func (a *Adapter) QueryRow(ctx context.Context, sql string, args ...any) pgx.Row
- func (a *Adapter) ReadAllRows(ctx context.Context, tableName string, pkgSchema packet.Schema) ([][]string, error)
- func (a *Adapter) ReadAllRowsStream(ctx context.Context, tableName string, pkgSchema packet.Schema) (packet.Schema, <-chan []string, <-chan error, error)
- func (a *Adapter) ReadRowsWithSQL(ctx context.Context, sqlQuery string, pkgSchema packet.Schema) ([][]string, error)
- func (a *Adapter) RenameTable(ctx context.Context, oldName, newName string) error
- func (a *Adapter) Schema() string
- func (a *Adapter) SetColumnarLayout(on bool)
- func (a *Adapter) SetMaxFallbackRows(n int64)
- func (a *Adapter) SetMaxMessageSize(size int)
- func (a *Adapter) SetSchema(schema string)
- func (a *Adapter) SetSkipSpecialValues(skip bool)
- func (a *Adapter) TableExists(ctx context.Context, tableName string) (bool, error)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func BuildFieldFromPGColumn ¶
func BuildFieldFromPGColumn(name, dataType string, isNullable, isPK bool, defaultValue string) (packet.Field, error)
BuildFieldFromPGColumn создает TDTP Field из информации о столбце PostgreSQL
func IsPostgreSQLReservedWord ¶
IsPostgreSQLReservedWord проверяет является ли слово зарезервированным в PostgreSQL
func ParsePostgreSQLType ¶
ParsePostgreSQLType парсит PostgreSQL тип и извлекает параметры
func PostgreSQLToTDTP ¶
PostgreSQLToTDTP конвертирует PostgreSQL тип в TDTP тип
func QuoteIdentifier ¶
QuoteIdentifier всегда заключает идентификатор в двойные кавычки, дублируя внутренние кавычки по правилам PostgreSQL/SQLite (RFC-совместимо). Условное квотирование было уязвимо: нижнерегистровый незарезервированный идентификатор возвращался без кавычек, допуская SQL-инъекцию через TableName.
func TDTPToPostgreSQL ¶
TDTPToPostgreSQL конвертирует TDTP тип в PostgreSQL CREATE TABLE тип. Текстовые поля без специального subtype всегда становятся TEXT — см. TDTPToPostgreSQLStrict, если нужно восстановить заявленную длину.
func TDTPToPostgreSQLStrict ¶
TDTPToPostgreSQLStrict — как TDTPToPostgreSQL, но при strict=true восстанавливает VARCHAR(field.Length) для TEXT/VARCHAR/CHAR/String без специального subtype, вместо безусловного TEXT.
strict=false (по умолчанию, и то же что TDTPToPostgreSQL) — CREATE TABLE не может обрезать данные при импорте: 7887de4 сначала восстанавливал VARCHAR(N) отсюда и был отменён именно потому, что это резало данные на интеграционных тестах ("Данные обрезались при импорте из-за ограничения длины"). Регрессия закрыта не тестом, а удалением кода — strict=true возвращает то же поведение осознанно, по флагу, а не по умолчанию.
strict=true — колонка получает то же ограничение длины, что было на источнике; вставка более длинного значения падает с ошибкой БД сразу, а не расширяется молча до TEXT. Точное совпадение длины гарантировано только при импорте назад в ту же СУБД, откуда шёл экспорт — единица длины (символы/байты) и правила усечения различаются между движками.
Types ¶
type Adapter ¶
type Adapter struct {
// contains filtered or unexported fields
}
Adapter представляет адаптер для работы с PostgreSQL Реализует интерфейс adapters.Adapter
func NewAdapter
deprecated
func NewAdapterWithSchema
deprecated
func (*Adapter) Connect ¶
Connect устанавливает подключение к PostgreSQL Реализует интерфейс adapters.Adapter
func (*Adapter) CreateTable ¶
CreateTable implements base.TableManager interface
func (*Adapter) ExecuteRawQuery ¶
ExecuteRawQuery выполняет произвольный SQL SELECT запрос и возвращает результат как DataPacket. Используется ETL pipeline для загрузки данных из источников. Использует тот же путь что и ExportTable: ReadRowsWithSQL → convertValueToTDTP → RowsToData.
func (*Adapter) ExportTable ¶
ExportTable экспортирует таблицу в TDTP reference пакеты Делегирует в base.ExportHelper для устранения дублирования кода
func (*Adapter) ExportTableIncremental ¶
func (a *Adapter) ExportTableIncremental(ctx context.Context, tableName string, incrementalConfig adapters.IncrementalConfig) ([]*packet.DataPacket, string, error)
ExportTableIncremental экспортирует только измененные записи с момента последней синхронизации Реализует интерфейс adapters.Adapter
func (*Adapter) ExportTableWithQuery ¶
func (a *Adapter) ExportTableWithQuery(ctx context.Context, tableName string, query *packet.Query, sender, recipient string) ([]*packet.DataPacket, error)
ExportTableWithQuery экспортирует таблицу с фильтрацией через TDTQL Делегирует в base.ExportHelper для устранения дублирования кода
func (*Adapter) GetDatabaseType ¶
GetDatabaseType возвращает тип СУБД Реализует интерфейс adapters.Adapter
func (*Adapter) GetDatabaseVersion ¶
GetDatabaseVersion возвращает версию PostgreSQL Реализует интерфейс adapters.Adapter
func (*Adapter) GetRowCount ¶
GetRowCount implements base.DataReader interface Returns the number of rows in a table
func (*Adapter) GetSchemas ¶
GetSchemas возвращает список всех схем в БД (helper метод)
func (*Adapter) GetTableNames ¶
GetTableNames возвращает список всех таблиц в текущей схеме Реализует интерфейс adapters.Adapter
func (*Adapter) GetTableSchema ¶
GetTableSchema читает схему таблицы из PostgreSQL через information_schema Реализует интерфейс adapters.Adapter
func (*Adapter) GetViewNames ¶
GetViewNames возвращает список всех views в текущей схеме с информацией об updatable/read-only Реализует интерфейс adapters.Adapter
func (*Adapter) ImportPacket ¶
func (a *Adapter) ImportPacket(ctx context.Context, pkt *packet.DataPacket, strategy adapters.ImportStrategy) error
ImportPacket импортирует один TDTP пакет в PostgreSQL. StrategyCopy: атомарная замена таблицы через временную (temp → rename). StrategyReplace/Ignore/Fail: прямой INSERT с ON CONFLICT в существующую таблицу. Реализует интерфейс adapters.Adapter
func (*Adapter) ImportPackets ¶
func (a *Adapter) ImportPackets(ctx context.Context, packets []*packet.DataPacket, strategy adapters.ImportStrategy) error
ImportPackets импортирует множество пакетов атомарно через временную таблицу ImportPackets импортирует множество пакетов атомарно. StrategyCopy: атомарная замена таблицы через временную (temp → rename). StrategyReplace/Ignore/Fail: прямой INSERT с ON CONFLICT в существующую таблицу, что позволяет накапливать данные из нескольких источников/файлов без затирания. Реализует интерфейс adapters.Adapter
func (*Adapter) InsertRows ¶
func (a *Adapter) InsertRows(ctx context.Context, tableName string, pktSchema packet.Schema, rows []packet.Row, strategy adapters.ImportStrategy) error
InsertRows implements base.DataInserter interface Uses COPY for bulk insert (PostgreSQL-specific fast path)
func (*Adapter) InspectTable ¶
func (a *Adapter) InspectTable(ctx context.Context, tableName string) (*adapters.TableReport, error)
InspectTable returns extended metadata for a live PostgreSQL table. Implements adapters.Adapter.
func (*Adapter) ParseFailures ¶
func (a *Adapter) ParseFailures() []base.ParseFailure
ParseFailures implements base.ParseFailureReporter: values this adapter's exports could not convert to their declared type, since the previous call.
func (*Adapter) ReadAllRows ¶
func (a *Adapter) ReadAllRows(ctx context.Context, tableName string, pkgSchema packet.Schema) ([][]string, error)
ReadAllRows implements base.DataReader interface Reads all rows from a table using a direct SQL query. Note: must NOT call ExportTable (avoids circular call via exportHelper.ExportTable → ReadAllRows).
func (*Adapter) ReadAllRowsStream ¶
func (a *Adapter) ReadAllRowsStream(ctx context.Context, tableName string, pkgSchema packet.Schema) (packet.Schema, <-chan []string, <-chan error, error)
ReadAllRowsStream читает таблицу потоком, реализуя base.StreamingDataReader.
Отдельная реализация, а не base.StreamSQLRows: тот работает с *sql.Rows, а этот адаптер живёт на pgx/pgxpool мимо database/sql. Общее у них — ячейка: значения идут через тот же pgCellToTDTP, что и readRowsWithSQL, поэтому потоковое и построчное чтение дают одни байты.
Запрос — тот же SELECT *, что у ReadAllRows, и по той же причине: схема сопоставляется с колонками ПО ПОЗИЦИИ (schema.Fields[i]), так что перечислять колонки в другом порядке нельзя.
Соединение берётся из пула на всю выгрузку. На большой таблице это минуты, и для боевой базы это заметнее, чем для файла: одно соединение из пула занято.
func (*Adapter) ReadRowsWithSQL ¶
func (a *Adapter) ReadRowsWithSQL(ctx context.Context, sqlQuery string, pkgSchema packet.Schema) ([][]string, error)
ReadRowsWithSQL implements base.DataReader interface Executes a SQL query and returns rows
func (*Adapter) RenameTable ¶
RenameTable implements base.TableManager interface
func (*Adapter) SetColumnarLayout ¶
SetColumnarLayout включает колоночную раскладку Data (--columnar).
func (*Adapter) SetMaxFallbackRows ¶
SetMaxFallbackRows задаёт лимит строк для in-memory fallback при провале SQL pushdown.
func (*Adapter) SetMaxMessageSize ¶
SetMaxMessageSize задаёт максимальный размер одного TDTP пакета (в байтах). Вызывается из CLI при указании --packet-size.
func (*Adapter) SetSkipSpecialValues ¶
SetSkipSpecialValues включает режим --fast: DetectAndApply пропускается.