Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save tiagofrancafernandes/b9dda11831e36fff1a32262b6987e78f to your computer and use it in GitHub Desktop.
Save tiagofrancafernandes/b9dda11831e36fff1a32262b6987e78f to your computer and use it in GitHub Desktop.
dev-SQL PostgreSQL snippets
UPDATE source_domains SET extra_data = REPLACE(extra_data::text, '\u0000', '')::jsonb WHERE extra_data::text LIKE '%\u0000%';

Prompt:

### meu banco estava em sqlite, migrei os dados para o postgres, pode ter ocorrido algum problema com a informação

### SQLSTATE[22P05]: Untranslatable character: 7 ERROR: unsupported Unicode escape sequence DETAIL: \u0000 cannot be converted to text. CONTEXT: JSON data, line 1: ...nk":"78297849","telephones":"ph:+61-4-10852\u0000... parallel worker (Connection: pgsql, SQL: select count(*) as aggregate from "source_domains" where ("extra_data"->>'techSpendUsd' = $5000) and "source_domains"."deleted_at" is null)

IA Answer

A mensagem de erro que você está recebendo indica que há um problema com caracteres não traduzíveis ao tentar manipular dados JSON no PostgreSQL. Especificamente, o erro menciona uma sequência de escape Unicode não suportada, \u0000, que é o caractere nulo (null character). O PostgreSQL não permite caracteres nulos em strings de texto.

Possíveis Causas e Soluções

  1. Caractere Nulo nos Dados:

    • Durante a migração de dados do SQLite para o PostgreSQL, caracteres nulos podem ter sido incluídos nos dados. O PostgreSQL não suporta esses caracteres em strings de texto.
  2. Limpeza dos Dados:

    • Antes de importar os dados para o PostgreSQL, é importante limpar os dados para remover caracteres nulos. Você pode fazer isso no SQLite ou no arquivo de exportação antes da importação.
  3. Remover Caracteres Nulos:

    • Se os dados já estão no PostgreSQL, você pode tentar remover os caracteres nulos diretamente no banco de dados. Aqui está um exemplo de como você pode fazer isso:

      UPDATE source_domains
      SET extra_data = REPLACE(extra_data::text, '\u0000', '')::jsonb
      WHERE extra_data::text LIKE '%\u0000%';
    • Este comando substitui o caractere nulo por uma string vazia em todos os registros que contêm esse caractere.

  4. Verificar e Corrigir Dados JSON:

    • Certifique-se de que os dados JSON estejam bem formados e não contenham caracteres ou sequências inválidas.
  5. Revisar o Processo de Migração:

    • Se possível, revise o processo de migração para garantir que os dados sejam exportados e importados corretamente, sem caracteres indesejados.

Considerações

  • Backup: Antes de realizar operações de limpeza ou atualização em massa, faça backup dos dados para evitar perda de informações.
  • Testes: Teste as operações de limpeza em um ambiente de desenvolvimento antes de aplicá-las em produção.
  • Ferramentas de Migração: Considere usar ferramentas de migração que possam ajudar a identificar e corrigir problemas de compatibilidade entre diferentes sistemas de banco de dados.

Seguindo essas etapas, você deve ser capaz de resolver o problema com caracteres não traduzíveis no PostgreSQL e garantir que seus dados estejam corretos e utilizáveis.

No Eloquent do Laravel

<?php

use Illuminate\Support\Facades\DB;

require_once __DIR__ . '/core.php';

$tables = [
    'users',
    'jobs',
    'failed_jobs',
    'source_domains',
    'source_files',
    'tags',
    'campaigns',
    'domain_task_runners',
    'domain_task_logs',
    'domain_error_logs',
];

foreach($tables as $tableName) {
    $columnName = 'id';

    $sql = "SELECT setval(pg_get_serial_sequence('{$tableName}', '{$columnName}'), coalesce(max($columnName)+1, 1), false) FROM {$tableName}";

    $result = DB::statement($sql);

    dump([
        'sql' => $sql,
        'result' => $result,
    ]);
}

Quais tabelas ocupam mais espaços

SELECT
    nspname AS schema_name,
    relname AS table_name,
    pg_size_pretty(pg_total_relation_size(C.oid)) AS total_size
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(C.oid) DESC;

This query returns the size of each table (including indexes and TOAST data) outside of the system schemas (pg_catalog, information_schema), ordered from largest to smallest. The pg_size_pretty function makes the size human-readable (e.g., "123 MB"). This helps you quickly identify the tables consuming the most space in your database.


Tamanho das bases de dados

SELECT
    pg_database.datname AS nome_do_banco,
    pg_size_pretty(pg_database_size(pg_database.datname)) AS tamanho
FROM
    pg_database
ORDER BY
    pg_database_size(pg_database.datname) DESC;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment