2016-04-08 21 views
6

Aggiungo programmaticamente dati a una tabella PostgreSQL usando Python e psycopg - questo funziona bene.Come determinare quale colonna è implicata in "valore troppo lungo per il tipo di carattere che varia"?

Di tanto in tanto, però, un valore di testo è troppo lungo per la colonna che contiene, in modo da ottenere il messaggio:

ERROR: value too long for type character varying(1000)

dove il numero è la larghezza della colonna incriminato.

C'è un modo per determinare quale colonna ha causato l'errore? (Oltre a confrontare la lunghezza di ogni colonna per vedere se è 1000)

+0

Controlla la query e la tua DDL – frlan

+0

@ che aiuto sarebbe nel caso di un tavolo esistente? Supponiamo che abbia già inserito 100 record con successo e che la registrazione 101 causi il problema: come posso sapere quale parte della mia istruzione INSERT è troppo lunga? –

risposta

1

Mille grazie a @Tometzky, il cui commento mi ha indirizzato nella giusta direzione.

Piuttosto che cercare di determinare quale colonna ha causato il problema dopo il fatto, ho modificato il mio script Python per garantire che il valore è stato troncato prima di inserire nel database.

  1. accesso schema della tabella utilizzando select column_name, data_type, character_maximum_length from information_schema.columns where table_name='test'

  2. quando si costruisce l'istruzione INSERT, utilizzare la definizione dello schema per identificare i campi di carattere e troncare, se necessario,

1

Non penso che ci sia un modo semplice.

Ho cercato di impostare la verbosità in psql, come ho assunto questo aiuterebbe, ma purtroppo non (a 9.4):

psql 
\set VERBOSITY verbose 
dbname=> create temporary table test (t varchar(5)); 
CREATE TABLE 
dbname=> insert into test values ('123456'); 
ERROR: 22001: value too long for type character varying(5) 
LOCATION: varchar, varchar.c:623 

Questo potrebbe essere qualcosa che garantisce la discussione sulla mailing list, come you are not the only one with this problem.

+0

Sai se esiste un modo per ottenere una definizione dello schema in modo programmatico? In questo modo conoscevo i limiti di ogni colonna in anticipo, quindi potevo troncarlo manualmente alla sua lunghezza massima –

+1

'seleziona character_maximum_length da information_schema.columns dove table_schema = 'pg_temp_2' e table_name = 'test' e table_column = 't' ; ' – Tometzky

+0

Mille grazie, il tuo commento mi ha dato le informazioni di cui avevo bisogno –