Copy Befehl ausführen

Hallo,

ich habe postgres neu installiert. Dann su postgres ausgefürt und

creatuser -d -P lxoffice


dann habe ich eine Datenbank (bank) mit lxoffice angelegt. eingeloggt habe ich mich im Admin-Tool ohne Passwort.


Jetzt möchte ich mit dem Befehl

COPY parts_temp
FROM ‘/home/name/lieferanten/preisliste.cvs’;

Daten in die Tabelle parts_temp kopieren. Dazu habe ich mich als root mit

psql -U lxoffice bank

angemeldet. Das klappt, wenn ich aber dann den Befehl ausführe kommt:


FEHLER: nur Superuser können COPY mit Dateien verwenden
HINT: Jeder kann COPY mit STDOUT oder STDIN verwenden. Der Befehl \copy in psql funktioniert auch für jeden.


Wie werde ich Superuser? Wie lautet der Benutername und das Passwort vom Superuser?

Wie kann ich mit STDIN kopieren?


Gruß Nixdorf

Hallo,

superuser ist der Benutzer postgres. Mit

su - postgres

wirst du auf der Konsole der Benutzer postgres und wenn du dich mit diesem auf die Datenbank verbindest sollte es gehen.

cu tb.

don’t work as root…

psql -U lxoffice bank

angemeldet. Das klappt, wenn ich aber dann den Befehl ausführe kommt:


FEHLER: nur Superuser können COPY mit Dateien verwenden
HINT: Jeder kann COPY mit STDOUT oder STDIN verwenden. Der Befehl \copy in psql funktioniert auch für jeden.

Normal. Das lesen der Datei macht der postmaster-prozeß, der läuft als User postgres, und dieser hat auf /home/bla/trallala keine Rechte. Packe die Datei z.B. nach /tmp und gib postgres da Rechte oder schreibe in die Datei oben den COPY-Befehl und zum Schluß das . rein und source die mit \i innerhalb von psql.
Oder auf der Kommandozeile, in etwa:

cat file.sql | psql -U lxoffice bank -s ‘copy bla from stdin;’

Andreas

hallo,

ich habe es mit:

cat /home/name/lieferanten/preisliste.csv | psql -U lxoffice bank -s ‘copy parts_tmp from stdin;’

probiert. Bekomme aber da noch ein:

psql: Warnung: überflüssiges Kommandozeilenargument »copy parts_tmp from stdin;« ignoriert


Dann kann ich das Passwort eingeben und er listet mit die preisliste auf.


Was muß ich noch ändern, damit er das auch in die Tabelle parts_tmp packt?


Gruß Nixdorf

Am einfachsten ist es, du machst forlgendes:

  • öffne die Datei, achte auf die Zeilen am Anfang und Ende. Etwa so:
kretschmer@KanotixBox:~$ cat t1.copy
copy t1 from stdin;
1       1
1       2
2       3
2       4
\.

kretschmer@KanotixBox:~$
  • rufe dann auf:

psql test -f t1.copy

Das, was in der Datei steht, wirdso ausgeführt, als würdest Du es in psql eintippsen. Die Freiräume zwischen den Spalten sind TABs.

Andreas

Hallo Andreas,

das sieht jetzt schon ganz gut aus.

wenn ich mich mit root zu su postgres wechsle, dann

psql bank -f preisliste.csv

ausführe erhalte ich:


postgres@debian:/home/frank/linbyte/lieferanten/actebis$ psql bank -f preisliste.csv
psql :p reisliste.csv:1: FEHLER: ungültige Eingabesyntax für ganze Zahl: »1000,1001114,“HP Nr15 Tinte schwarz 25ml HV DJ840c DJ843c”,“N”,17.56,17.56,10.04.07,“N”,0,“Verbrauchsmaterial”,“f”,“f”,“f”,0,15,79,151,“N”,“f”,“f”,“f”,“N”,“N”,“N”,0,0,“0.00000”,“2007-04-16 12:46:07.497966”,“2007-04-16 15:26:33.434352”,“Stck”,“N”,“f”,815,0,“N”«
CONTEXT: COPY parts_tmp, Zeile 1, Spalte id: »1000,1001114,“HP Nr15 Tinte schwarz 25ml HV DJ840c DJ843c”,“N”,17.56,17.56,10.04.07,“N”,0,"Verbrauch…«


der erste teil meiner meiner CSV - Datei sieht so aus:

copy parts from stdin;
“id”,“partnumber”,“description”,“listprice”,“sellprice”,“lastcost”,“priceupdate”,“weight”,“onhand”,“notes”,“makemodel”,“assembly”,“alternate”,“rop”,“inventory_accno_id”,“income_accno_id”,“expense_accno_id”,“bin”,“shop”,“obsolete”,“bom”,“image”,“drawing”,“microfiche”,“partsgroup_id”,“ve”,“gv”,“itime”,“mtime”,“unit”,“formel”,“not_discountable”,“buchungsgruppen_id”,“payment_id”,“ean”
1000,1001114,“HP Nr15 Tinte schwarz 25ml HV DJ840c DJ843c”,"\N",17.56,17.56,10.04.07,"\N",0,“Verbrauchsmaterial”,“f”,“f”,“f”,0,15,79,151,"\N",“f”,“f”,“f”,"\N","\N","\N",0,0,“0.00000”,“2007-04-16 12:46:07.497966”,“2007-04-16 15:26:33.434352”,“Stck”,"\N",“f”,815,0,"\N"
1001,1001158,“INTEL Pro100S 10/100 ServerNIC PCI RTL 168Bit”,"\N",40.9,40.9,10.04.07,"\N",0,“Netzwerkhardware”,“f”,“f”,“f”,0,15,79,151,"\N",“f”,“f”,“f”,"\N","\N","\N",0,0,“0.00000”,“2007-04-16 12:46:07.497966”,“2007-04-16 15:26:33.434352”,“Stck”,"\N",“f”,815,0,"\N"
1002,1001159,"INTEL 5x Pro100S ServerNIC 168Bit PCI 10/100


Anstadt Tabs habe ich Kommas, aber das scheint ja nicht zu stören, er meckert ja:

ungültige Eingabesyntax für ganze Zahl, wenn das für das erste feld gleich gilt, das ist id (integer).

Aber die gleich CSV- Datei habe ich ja schon mit phppgadmin in die Datenbank verschoben. Auf dem Weg kann ich nur nicht die ganze Datei (50000 datensäte) hochladen.


Noch eine Idee?


Gruß Nixdorf

Hallo Andreas,

das sieht jetzt schon ganz gut aus.

wenn ich mich mit root zu su postgres wechsle, dann

psql bank -f preisliste.csv

ausführe erhalte ich:


postgres@debian:/home/frank/linbyte/lieferanten/actebis$ psql bank -f preisliste.csv
psql :p reisliste.csv:1: FEHLER: ungültige Eingabesyntax für ganze Zahl: »1000,1001114,“HP Nr15 Tinte schwarz 25ml HV DJ840c DJ843c”,“N”,17.56,17.56,10.04.07,“N”,0,“Verbrauchsmaterial”,“f”,“f”,“f”,0,15,79,151,“N”,“f”,“f”,“f”,“N”,“N”,“N”,0,0,“0.00000”,“2007-04-16 12:46:07.497966”,“2007-04-16 15:26:33.434352”,“Stck”,“N”,“f”,815,0,“N”«
CONTEXT: COPY parts_tmp, Zeile 1, Spalte id: »1000,1001114,“HP Nr15 Tinte schwarz 25ml HV DJ840c DJ843c”,“N”,17.56,17.56,10.04.07,“N”,0,"Verbrauch…«


der erste teil meiner meiner CSV - Datei sieht so aus:

copy parts from stdin;
“id”,“partnumber”,“description”,“listprice”,“sellprice”,“lastcost”,“priceupdate”,“weight”,“onhand”,“notes”,“makemodel”,“assembly”,“alternate”,“rop”,“inventory_accno_id”,“income_accno_id”,“expense_accno_id”,“bin”,“shop”,“obsolete”,“bom”,“image”,“drawing”,“microfiche”,“partsgroup_id”,“ve”,“gv”,“itime”,“mtime”,“unit”,“formel”,“not_discountable”,“buchungsgruppen_id”,“payment_id”,“ean”
1000,1001114,“HP Nr15 Tinte schwarz 25ml HV DJ840c DJ843c”,"\N",17.56,17.56,10.04.07,"\N",0,“Verbrauchsmaterial”,“f”,“f”,“f”,0,15,79,151,"\N",“f”,“f”,“f”,"\N","\N","\N",0,0,“0.00000”,“2007-04-16 12:46:07.497966”,“2007-04-16 15:26:33.434352”,“Stck”,"\N",“f”,815,0,"\N"
1001,1001158,“INTEL Pro100S 10/100 ServerNIC PCI RTL 168Bit”,"\N",40.9,40.9,10.04.07,"\N",0,“Netzwerkhardware”,“f”,“f”,“f”,0,15,79,151,"\N",“f”,“f”,“f”,"\N","\N","\N",0,0,“0.00000”,“2007-04-16 12:46:07.497966”,“2007-04-16 15:26:33.434352”,“Stck”,"\N",“f”,815,0,"\N"
1002,1001159,"INTEL 5x Pro100S ServerNIC 168Bit PCI 10/100


Anstadt Tabs habe ich Kommas, aber das scheint ja nicht zu stören, er meckert ja:

ungültige Eingabesyntax für ganze Zahl, wenn das für das erste feld gleich gilt, das ist id (integer).

Aber die gleich CSV- Datei habe ich ja schon mit phppgadmin in die Datenbank verschoben. Auf dem Weg kann ich nur nicht die ganze Datei (50000 datensäte) hochladen.


Noch eine Idee?


Gruß Nixdorf

Fein.

Anstadt Tabs habe ich Kommas, aber das scheint ja nicht zu stören, er meckert ja:

Doch.

ungültige Eingabesyntax für ganze Zahl, wenn das für das erste feld gleich gilt, das ist id (integer).

Das erste Feld, was PG sieht, endet am TAB. Preisfrage: wo ist das TAB? Zusatzfrage: ist im ersten Feld, also vor dem ersten Tab, ein INT?

Aber die gleich CSV- Datei habe ich ja schon mit phppgadmin in die Datenbank verschoben. Auf dem Weg kann ich nur nicht die ganze Datei (50000 datensäte) hochladen.

ich nix phppgadmin. Das wird vermulich wissen, was zu tun ist.

Noch eine Idee?


tr ',' '\t'

Andreas

Hallo,

ich habe anstadt Kommas Tabs, aber immer noch ist postgres noch nicht zufrieden mit mir.

So sieht jetzt der Anfang meiner CSV-Datei aus:

“copy parts_tmp from stdin”
“id” “partnumber” “description” “listprice” “sellprice” “lastcost” “priceupdate” “weight” “onhand” “notes” “makemodel” “assembly” “alternate” “rop” “inventory_accno_id” “income_accno_id” “expense_accno_id” “bin” “shop” “obsolete” “bom” “image” “drawing” “microfiche” “partsgroup_id” “ve” “gv” “itime” “mtime” “unit” “formel” “not_discountable” “buchungsgruppen_id” “payment_id” “ean”
1000 1001114 “HP Nr15 Tinte schwarz 25ml HV DJ840c DJ843c” “\N” 17.56 17.56 10.04.07 “\N” 0 “Verbrauchsmaterial” “f” “f” “f” 0 15 79 151 “\N” “f” “f” “f” “\N” “\N” “\N” 0 0 “0.00000” “2007-04-16 12:46:07.497966” “2007-04-16 15:26:33.434352” “Stck” “\N” “f” 815 0 “\N”
1001 1001158 “INTEL Pro100S 10/100 ServerNIC PCI RTL 168Bit” “\N” 40.9 40.9 10.04.07 “\N” 0 “Netzwerkhardware” “f” “f” “f” 0 15 79 151 “\N” “f” “f” “f” “\N” “\N” “\N” 0 0 “0.00000” “2007-04-16 12:46:07.497966” “2007-04-16 15:26:33.434352” “Stck” “\N” “f” 815 0 “\N”


Als Fehlermeldung bekomme ich jetzt:

psql :p reisliste_2.csv:1: FEHLER: ungültige Eingabesyntax für ganze Zahl: »“id”«
CONTEXT: COPY parts_tmp, Zeile 1, Spalte id: »“id”«


Das ist die 1000 in der CSV-Datei. Danach kommt ein Tab. Eine ganze Zahl ist es doch auch.

Gruß Nixdorf

Hallo,

ich habe anstadt Kommas Tabs, aber immer noch ist postgres noch nicht zufrieden mit mir.

So sieht jetzt der Anfang meiner CSV-Datei aus:

“copy parts_tmp from stdin”
“id” “partnumber” “description” “listprice” “sellprice” “lastcost” “priceupdate” “weight” “onhand” “notes” “makemodel” “assembly” “alternate” “rop” “inventory_accno_id” “income_accno_id” “expense_accno_id” “bin” “shop” “obsolete” “bom” “image” “drawing” “microfiche” “partsgroup_id” “ve” “gv” “itime” “mtime” “unit” “formel” “not_discountable” “buchungsgruppen_id” “payment_id” “ean”
1000 1001114 “HP Nr15 Tinte schwarz 25ml HV DJ840c DJ843c” “\N” 17.56 17.56 10.04.07 “\N” 0 “Verbrauchsmaterial” “f” “f” “f” 0 15 79 151 “\N” “f” “f” “f” “\N” “\N” “\N” 0 0 “0.00000” “2007-04-16 12:46:07.497966” “2007-04-16 15:26:33.434352” “Stck” “\N” “f” 815 0 “\N”
1001 1001158 “INTEL Pro100S 10/100 ServerNIC PCI RTL 168Bit” “\N” 40.9 40.9 10.04.07 “\N” 0 “Netzwerkhardware” “f” “f” “f” 0 15 79 151 “\N” “f” “f” “f” “\N” “\N” “\N” 0 0 “0.00000” “2007-04-16 12:46:07.497966” “2007-04-16 15:26:33.434352” “Stck” “\N” “f” 815 0 “\N”


Als Fehlermeldung bekomme ich jetzt:

psql :p reisliste_2.csv:1: FEHLER: ungültige Eingabesyntax für ganze Zahl: »“id”«
CONTEXT: COPY parts_tmp, Zeile 1, Spalte id: »“id”«


Das ist die 1000 in der CSV-Datei. Danach kommt ein Tab. Eine ganze Zahl ist es doch auch.

Gruß Nixdorf

Nein. Das ist das “id”. Wenn Du eine CSV-Datei mit Headern einlesen willst, dann solltest Du das ankündigen und nicht erwarten, daß PG ein “id” von sich aus zu 1000 wandelt…

Wie wäre es, jetzt mal die Doku zu lesen?

Btw.: die " um die Zeile mit dem COPY drumherum sind hyperfluid, dafür fehlt das abschließende ‘;’.


Andreas

Hallo,

ich habe das leider immer noch nicht gelöst. Warum ist 1000 eine ungültige Eingabesytax für eine ganze Zahl?

Gruß NIxdorf

Weil in Deinem Beispiel der COPY-Befehl NICHT angekündigt hat, daß die CSV-Datei CSV-Header enthält. Damit versucht PG, die nächste Zeile bereits als Daten zu interpretieren und fällt gleich mit dem “id” auf die Schnauze beim Versuch, aus “id” eine Integer-Zahl zu machen. Ein String “id” läßt sich dummerweise halt auch selbst mit viel Liebe kaum als 1000 interpretieren.

Andreas

Hallo,

ok, die zweite Zeile mit:

“id” “partnumber” “description” “listprice” “sellprice” “lastcost” “priceupdate” “weight” “onhand” “notes” “makemodel” “assembly” “alternate” “rop” “inventory_accno_id” “income_accno_id” “expense_accno_id” “bin” “shop” “obsolete” “bom” “image” “drawing” “microfiche” “partsgroup_id” “ve” “gv” “itime” “mtime” “unit” “formel” “not_discountable” “buchungsgruppen_id” “payment_id” “ean”

habe ich rausgenommen.


Die erte Zeile sieht so aus:

copy parts_tmp from stdin;


So sah zunächst die Zeile für einen Artikel aus:

1000 1001114 “HP Nr15 Tinte schwarz 25ml HV DJ840c DJ843c” “\N” 17.56 17.56 10.04.07 “\N” 0 “Verbrauchsmaterial” “f” “f” “f” 0 15 79 151 “\N” “f” “f” “f” “\N” “\N” “\N” 0 0 “0.00000” “2007-04-16 12:46:07.497966” “2007-04-16 15:26:33.434352” “Stck” “\N” “f” 815 0 “\N”

Bei den \N ` s hat postgres gemeckert das man soetwas in ein Feld vom Typ Numreik nicht eintragen darf. In der Datenbank sind aber Artikle drin, die mit dem Wahrenwirtschftsystem abgelegt wurden und die auch überall diese \N - Eintrage haben. Nur mit dem Copy-Befehl kann die so nicht eintragen. Kann man da etwas machen?

Ich habe mir so beholfen, das ich überall eine 0 eingetragen habe. Da das aber auch Preise sind, kann ich mir auch vorstellen das das Wahrewirtschaftsystem damit Propbleme hat.


Was noch auftritt, ich habe felder das trägt das Wahrewirtschaftsystem ein f ein. Die Felder in der DB sind als boolean formatiert.

Wenn ich jetzt aber mit meiner CSV-Datei und dem Copy-Befehl versuche die Daten in die DB zu schreiben, kommt:

psql:/home/frank/linbyte/lieferanten/actebis/preisliste.csv:1: FEHLER: ungültige Eingabesyntax für Typ boolean: »“f”«
CONTEXT: COPY parts_tmp, Zeile 1, Spalte makemodel: »“f”«


Wie kommt das das ich mit dem Copy-Befehl das immer nicht kann, In der Datenbank aber solche Einträge vorhanden sind?


Gruß Nixdorf

Ja, man könnte es richtig machen.

test=# create table forum (id int, wert numeric(10,2));
CREATE TABLE
test=*# copy forum from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1    \N
>> 2    1
>> \.
test=*# select * from forum;
 id | wert
----+------
  1 |
  2 | 1.00
(2 rows)

test=*# copy forum from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 2    "\N"
>> \.
ERROR:  invalid input syntax for type numeric: ""N""
CONTEXT:  COPY forum, line 1, column wert: ""N""



Ich habe mir so beholfen, das ich überall eine 0 eingetragen habe. Da das aber auch Preise sind, kann ich mir auch vorstellen das das Wahrewirtschaftsystem damit Propbleme hat.

0 != NULL

test=*# select * from forum;
 id | wert
----+-------
  1 |
  2 |  0.00
  3 | 10.00
(3 rows)

test=*# select avg(wert) from forum;
        avg
--------------------
 5.0000000000000000
(1 row)

test=*# select avg(coalesce(wert,0)) from forum ;
        avg
--------------------
 3.3333333333333333
(1 row)

Das nur als Hinweis, falls Du Dich mal wunderst, wenn Deine Statistiken später Dir komisch vorkommen.

Was noch auftritt, ich habe felder das trägt das Wahrewirtschaftsystem ein f ein. Die Felder in der DB sind als boolean formatiert.

Wenn ich jetzt aber mit meiner CSV-Datei und dem Copy-Befehl versuche die Daten in die DB zu schreiben, kommt:

psql:/home/frank/linbyte/lieferanten/actebis/preisliste.csv:1: FEHLER: ungültige Eingabesyntax für Typ boolean: »“f”«
CONTEXT: COPY parts_tmp, Zeile 1, Spalte makemodel: »“f”«


test=# create table forum (id int, flag bool);
CREATE TABLE
test=*# copy forum from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1    f
>> 2    0
>> 3    t
>> 4    1
>> \.
test=*# select * from forum;
 id | flag
----+------
  1 | f
  2 | f
  3 | t
  4 | t
(4 rows)



Wie kommt das das ich mit dem Copy-Befehl das immer nicht kann, In der Datenbank aber solche Einträge vorhanden sind?

Das ist eine Frage der Darstellung.

Andreas

Hallo,

also wenn ich Dich richtig verstanden habe stören die Anführungszeichen bei “\N”. Das sind die Textrenner in meiner CSV-Datei, das kann ich auch noch ’ verwenden, wenn ich die CSV-Datei mit Openoffice abspeichere. Das habe ich schon probiert, klappt aber auch nicht. Andere Optionen habe ich aber nicht. Das weiß ich jetzt nicht wie ich die " bei den “\N” - Einträgen herausbekommen soll.

Beim “f” - Eintrag ist das wohl genau das selbe problem.

Da würde ich noch mal einen Denkanstoß benötigen.


Mit freundlichen Grüßen

NIxdorf

Hallo,

ok, das kann man dann wohl noch mal mit einem Editor machen, da bin ich gerade dabei…


Gruß Nixdorf

Hallo,

das sieht so aus als ob es jetzt geklappt hat.

Jetzt muß ich nur noch die Daten die jetzt in einer Temporären Tabelle parts_tep sind in die Tabelle parts überführen. Das mache damit ich später die artikel in der Tabelle parts immer wieder aktualisieren kann und ggf. nicht mehr vorhandene Artikel auch automatisch löschen kann.


Vielen Dank für die HIlfe…

Gruß Nixdorf