1
0
mirror of https://github.com/ManyakRus/starter.git synced 2025-11-25 23:02:22 +02:00

сделал ReplaceSchema()

This commit is contained in:
Nikitin Aleksandr
2025-08-13 13:42:42 +03:00
parent 980272942e
commit 27726ad3d3
2 changed files with 86 additions and 14 deletions

View File

@@ -61,6 +61,25 @@ const TextConnBusy = "conn busy"
// timeOutSeconds - время ожидания для Ping() // timeOutSeconds - время ожидания для Ping()
const timeOutSeconds = 60 const timeOutSeconds = 60
// IConnectionTransaction - интерфейс для работы с базой данных
// объединяет в себе функции pgx.Conn, pgxpool.Pool и pgx.Tx
// чтобы передавать в функцию любой их них
type IConnectionTransaction interface {
// Transaction management
Begin(ctx context.Context) (pgx.Tx, error)
// Query execution
Exec(ctx context.Context, sql string, arguments ...any) (pgconn.CommandTag, error)
Query(ctx context.Context, sql string, args ...any) (pgx.Rows, error)
QueryRow(ctx context.Context, sql string, args ...any) pgx.Row
// Batch operations
SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults
// Bulk copy operations
CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error)
}
// Connect_err - подключается к базе данных // Connect_err - подключается к базе данных
func Connect() { func Connect() {
@@ -542,21 +561,26 @@ func Ping_err(ctxMain context.Context) error {
return err return err
} }
// IConnectionTransaction - интерфейс для работы с базой данных // ReplaceSchema - заменяет "public." на Settings.DB_SCHEMA
// объединяет в себе функции pgx.Conn, pgxpool.Pool и pgx.Tx func ReplaceSchema(TextSQL string) string {
// чтобы передавать в функцию любой их них Otvet := TextSQL
type IConnectionTransaction interface {
// Transaction management
Begin(ctx context.Context) (pgx.Tx, error)
// Query execution if Settings.DB_SCHEMA == "" {
Exec(ctx context.Context, sql string, arguments ...any) (pgconn.CommandTag, error) return Otvet
Query(ctx context.Context, sql string, args ...any) (pgx.Rows, error) }
QueryRow(ctx context.Context, sql string, args ...any) pgx.Row
Otvet = strings.ReplaceAll(Otvet, "\tpublic.", "\t"+Settings.DB_SCHEMA+".")
// Batch operations Otvet = strings.ReplaceAll(Otvet, "\npublic.", "\n"+Settings.DB_SCHEMA+".")
SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults Otvet = strings.ReplaceAll(Otvet, " public.", " "+Settings.DB_SCHEMA+".")
// Bulk copy operations return Otvet
CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error) }
// ReplaceSchemaName - заменяет имя схемы в тексте SQL
func ReplaceSchemaName(TextSQL, SchemaNameFrom string) string {
Otvet := TextSQL
Otvet = strings.ReplaceAll(Otvet, SchemaNameFrom+".", Settings.DB_SCHEMA+".")
return Otvet
} }

View File

@@ -187,3 +187,51 @@ SELECT * FROM temp_TestRawMultipleSQL2
} }
} }
func TestReplaceSchema(t *testing.T) {
tests := []struct {
name string
input string
schema string
expected string
}{
{
name: "No schema",
input: "SELECT * FROM public.users",
schema: "",
expected: "SELECT * FROM public.users",
},
{
name: "Schema with tabs and newlines",
input: "\tSELECT * FROM public.users\n",
schema: "myschema",
expected: "\tSELECT * FROM myschema.users\n",
},
{
name: "Schema with spaces",
input: "SELECT * FROM public.users ",
schema: "myschema",
expected: "SELECT * FROM myschema.users ",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Settings.DB_SCHEMA = tt.schema
got := ReplaceSchema(tt.input)
if got != tt.expected {
t.Errorf("ReplaceSchema() = %v, expected %v", got, tt.expected)
}
})
}
}
func TestReplaceSchemaName(t *testing.T) {
TextSQL := "SELECT * FROM public.users"
Settings.DB_SCHEMA = "myschema"
ExpectedSQL := "SELECT * FROM myschema.users"
ActualSQL := ReplaceSchemaName(TextSQL, "public")
if ActualSQL != ExpectedSQL {
t.Errorf("Expected %v, but got %v", ExpectedSQL, ActualSQL)
}
}