PG erreur de COPIE: entrée non valide syntaxe entier
De course COPIER
résultats dans ERROR: invalid input syntax for integer: ""
message d'erreur pour moi. Ce qui me manque?
Mon /tmp/people.csv
fichier:
"age","first_name","last_name"
"23","Ivan","Poupkine"
"","Eugene","Pirogov"
Mon /tmp/csv_test.sql
fichier:
CREATE TABLE people (
age integer,
first_name varchar(20),
last_name varchar(20)
);
COPY people
FROM '/tmp/people.csv'
WITH (
FORMAT CSV,
HEADER true,
NULL ''
);
DROP TABLE people;
De sortie:
$ psql postgres -f /tmp/sql_test.sql
CREATE TABLE
psql:sql_test.sql:13: ERROR: invalid input syntax for integer: ""
CONTEXT: COPY people, line 3, column age: ""
DROP TABLE
Trivia:
- PostgreSQL 9.2.4
- Il serait donc utile que si elle dit la ligne/colonne a été à l'origine du problème 🙁
Vous devez vous connecter pour publier un commentaire.
""
n'est pas un entier valide. PostgreSQL accepte non cotées les champs vides comme la valeur null par défaut dans le format CSV, mais""
serait comme écrire:et ne parviennent pas pour la même raison.
Si vous voulez traiter avec la CSV qui a des choses comme la cité des chaînes vides pour les nuls entiers, vous aurez besoin de les nourrir à PostgreSQL via un pré-processeur qui peut être vaincus un peu. PostgreSQL CSV d'entrée ne comprennent pas tous l'étrange et le merveilleux d'éventuels abus de CSV.
Options comprennent:
csv
module PerlText::CSV
, etc pour pré-traiter;""
avec une vierge, mais je n'avais que quelques lignes, ce qui pourrait provoquer des erreurs avec de gros fichiers CSV, mais a bien fonctionné pour mon cas simple d'utilisation.Je pense qu'il est préférable de modifier votre fichier csv comme:
Il est également possible de définir votre table comme
et après la copie, vous pouvez convertir des chaînes vides:
text
type pour toutes les colonnes lors de l'importation. PostgreSQL ne se soucie pasvarchar
longueur de toute façon.J'ai eu ce même message d'erreur sur un postgres
.sql
fichier avec unCOPY
déclaration, mais mon dossier a été séparé par des tabulations au lieu de séparées par des virgules et cité.Mon erreur était que je me suis empressée de copier/coller le contenu du fichier de github, mais dans ce processus, tous les onglets ont été convertis en espaces, d'où l'erreur. J'ai dû télécharger et enregistrer le fichier raw pour obtenir une bonne copie.
J'ai eu cette erreur lors du chargement de '|' séparés fichier CSV bien qu'il n'y avait pas de '"' caractères dans mon fichier d'entrée. Il s'est avéré que j'ai oublié de préciser FORMAT:
COPIE ... DE ... AVEC (FORMAT CSV, SÉPARATEUR '|').
Fini par faire cela à l'aide de
csvfix
:Dans le cas où vous savez que les colonnes qui étaient destinées à être
integer
oufloat
, vous pouvez spécifier simplement:Sans préciser exactement les colonnes, on peut faire l'expérience d'un évident effet secondaire, où une chaîne vide sera transformée en une chaîne de caractères avec un
0
caractère.""
avec un vide dans le CSVIl y a un moyen de résoudre "", la cité chaîne null comme valeur null dans la colonne de type integer,
utilisation FORCE_NULL option :
voir postgresql document, https://www.postgresql.org/docs/current/static/sql-copy.html
cela devrait fonctionner sans vous de modifier le fichier csv de source:
"prenom","âge","last_name"
Ivan,23,Poupkine
Eugene,,Pirogov
copie gens de
'file.csv'
avec (séparateur ';', null ");Juste dans la première colonne.....
Viens de tomber sur ce en attendant de trouver une solution et je voulais ajouter que j'ai été capable de résoudre le problème en ajoutant de la valeur "null" paramètre de la copy_from appel: