Wie kann ich eine gespeicherte Prozedur schreiben, die Daten aus einer CSV-Datei importiert und die Tabelle auffüllt?
Wie kann ich eine gespeicherte Prozedur schreiben, die Daten aus einer CSV-Datei importiert und die Tabelle auffüllt?
Antworten:
Schauen Sie sich diesen kurzen Artikel an .
Lösung hier umschrieben:
Erstellen Sie Ihre Tabelle:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Kopieren Sie Daten aus Ihrer CSV-Datei in die Tabelle:
COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' WITH (FORMAT csv);
COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV HEADER;
einfügen
Wenn Sie keine Berechtigung zur Verwendung haben COPY
(die auf dem Datenbankserver funktioniert), können Sie \copy
stattdessen verwenden (was auf dem Datenbankclient funktioniert). Verwenden Sie das gleiche Beispiel wie Bozhidar Batsov:
Erstellen Sie Ihre Tabelle:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Kopieren Sie Daten aus Ihrer CSV-Datei in die Tabelle:
\copy zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Sie können auch die zu lesenden Spalten angeben:
\copy zip_codes(ZIP,CITY,STATE) FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Siehe die Dokumentation zu COPY :
Verwechseln Sie COPY nicht mit der psql-Anweisung \ copy. \ copy ruft COPY FROM STDIN oder COPY TO STDOUT auf und ruft die Daten in einer Datei ab, auf die der psql-Client zugreifen kann. Daher hängen der Dateizugriff und die Zugriffsrechte eher vom Client als vom Server ab, wenn \ copy verwendet wird.
und Anmerkung:
Bei Identitätsspalten schreibt der Befehl COPY FROM immer die in den Eingabedaten angegebenen Spaltenwerte, wie z. B. die Option INSERT OVERRIDING SYSTEM VALUE.
COPY
und \copy
ist viel mehr als nur Berechtigungen, und Sie können nicht einfach ein `` hinzufügen, damit es magisch funktioniert. Siehe die Beschreibung (im Zusammenhang mit dem Export) hier: stackoverflow.com/a/1517692/157957
Eine schnelle Möglichkeit hierfür ist die Python-Pandas-Bibliothek (Version 0.15 oder höher funktioniert am besten). Auf diese Weise werden die Spalten für Sie erstellt - obwohl die Auswahlmöglichkeiten für Datentypen möglicherweise nicht Ihren Wünschen entsprechen. Wenn es nicht ganz das tut, was Sie wollen, können Sie immer den als Vorlage generierten Code "Tabelle erstellen" verwenden.
Hier ist ein einfaches Beispiel:
import pandas as pd
df = pd.read_csv('mypath.csv')
df.columns = [c.lower() for c in df.columns] #postgres doesn't like capitals or spaces
from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/dbname')
df.to_sql("my_table_name", engine)
Und hier ist ein Code, der Ihnen zeigt, wie Sie verschiedene Optionen einstellen:
# Set it so the raw sql output is logged
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
df.to_sql("my_table_name2",
engine,
if_exists="append", #options are ‘fail’, ‘replace’, ‘append’, default ‘fail’
index=False, #Do not output the index of the dataframe
dtype={'col1': sqlalchemy.types.NUMERIC,
'col2': sqlalchemy.types.String}) #Datatypes should be [sqlalchemy types][1]
if_exists
Parameter so eingestellt werden, dass er eine vorhandene Tabelle ersetzt oder df.to_sql("fhrs", engine, if_exists='replace')
df.to_sql()
ist wirklich langsam, können Sie d6tstack.utils.pd_to_psql()
von d6tstack verwenden, um Leistungsvergleich zu sehen
Sie können auch pgAdmin verwenden, das eine grafische Benutzeroberfläche für den Import bietet. Das wird in diesem SO-Thread gezeigt . Der Vorteil der Verwendung von pgAdmin besteht darin, dass es auch für entfernte Datenbanken funktioniert.
Ähnlich wie bei den vorherigen Lösungen müssten Sie Ihre Tabelle jedoch bereits in der Datenbank haben. Jede Person hat ihre eigene Lösung, aber normalerweise öffne ich die CSV in Excel, kopiere die Überschriften, füge Special mit Transposition in ein anderes Arbeitsblatt ein, platziere den entsprechenden Datentyp in der nächsten Spalte und kopiere ihn einfach und füge ihn in einen Texteditor ein zusammen mit der entsprechenden SQL-Tabellenerstellungsabfrage wie folgt:
CREATE TABLE my_table (
/*paste data from Excel here for example ... */
col_1 bigint,
col_2 bigint,
/* ... */
col_n bigint
)
Die meisten anderen Lösungen hier erfordern, dass Sie die Tabelle im Voraus / manuell erstellen. Dies ist in einigen Fällen möglicherweise nicht praktikabel (z. B. wenn die Zieltabelle viele Spalten enthält). Der folgende Ansatz kann daher nützlich sein.
Wenn Sie den Pfad und die Spaltenanzahl Ihrer CSV-Datei angeben, können Sie die folgende Funktion verwenden, um Ihre Tabelle in eine temporäre Tabelle zu laden, die wie folgt benannt wird target_table
:
Es wird angenommen, dass die oberste Zeile die Spaltennamen enthält.
create or replace function data.load_csv_file
(
target_table text,
csv_path text,
col_count integer
)
returns void as $$
declare
iter integer; -- dummy integer to iterate columns with
col text; -- variable to keep the column name at each iteration
col_first text; -- first column name, e.g., top left corner on a csv file or spreadsheet
begin
create table temp_table ();
-- add just enough number of columns
for iter in 1..col_count
loop
execute format('alter table temp_table add column col_%s text;', iter);
end loop;
-- copy the data from csv file
execute format('copy temp_table from %L with delimiter '','' quote ''"'' csv ', csv_path);
iter := 1;
col_first := (select col_1 from temp_table limit 1);
-- update the column names based on the first row which has the column names
for col in execute format('select unnest(string_to_array(trim(temp_table::text, ''()''), '','')) from temp_table where col_1 = %L', col_first)
loop
execute format('alter table temp_table rename column col_%s to %s', iter, col);
iter := iter + 1;
end loop;
-- delete the columns row
execute format('delete from temp_table where %s = %L', col_first, col_first);
-- change the temp table name to the name given as parameter, if not blank
if length(target_table) > 0 then
execute format('alter table temp_table rename to %I', target_table);
end if;
end;
$$ language plpgsql;
public
)
Wie Paul erwähnte, funktioniert der Import in pgAdmin:
Rechtsklick auf Tabelle -> Importieren
Wählen Sie die lokale Datei, das Format und die Codierung aus
hier ist ein deutscher pgAdmin GUI Screenshot:
Ähnliches können Sie mit DbVisualizer tun (ich habe eine Lizenz, bin mir nicht sicher über die kostenlose Version)
Rechtsklick auf eine Tabelle -> Tabellendaten importieren ...
Erstellen Sie zuerst eine Tabelle
Verwenden Sie dann den Befehl copy, um die Tabellendetails zu kopieren:
Kopieren Sie den Tabellennamen (C1, C2, C3 ....)
von 'Pfad zu Ihrer CSV-Datei' Trennzeichen ',' CSV-Header;
Vielen Dank
Verwenden Sie diesen SQL-Code
copy table_name(atribute1,attribute2,attribute3...)
from 'E:\test.csv' delimiter ',' csv header
Das Schlüsselwort header teilt dem DBMS mit, dass die CSV-Datei einen Header mit Attributen enthält
Weitere Informationen finden Sie unter http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
Persönliche Erfahrung mit PostgreSQL, immer noch auf einen schnelleren Weg wartend.
1. Erstellen Sie zuerst ein Tabellenskelett, wenn die Datei lokal gespeichert ist:
drop table if exists ur_table;
CREATE TABLE ur_table
(
id serial NOT NULL,
log_id numeric,
proc_code numeric,
date timestamp,
qty int,
name varchar,
price money
);
COPY
ur_table(id, log_id, proc_code, date, qty, name, price)
FROM '\path\xxx.csv' DELIMITER ',' CSV HEADER;
2. Wenn sich die Datei \ path \ xxx.csv auf dem Server befindet und postgreSQL nicht über die Berechtigung zum Zugriff auf den Server verfügt, müssen Sie die CSV-Datei über die in pgAdmin integrierte Funktionalität importieren.
Klicken Sie mit der rechten Maustaste auf den Tabellennamen und wählen Sie Importieren.
Wenn Sie immer noch Probleme haben, lesen Sie bitte dieses Tutorial. http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
Wie importiere ich CSV-Dateidaten in eine PostgreSQL-Tabelle?
Schritte:
Postgresql-Datenbank muss im Terminal verbunden werden
psql -U postgres -h localhost
Datenbank muss erstellt werden
create database mydb;
Müssen Benutzer erstellen
create user siva with password 'mypass';
Mit Datenbank verbinden
\c mydb;
Müssen Schema erstellen
create schema trip;
Müssen Tabelle erstellen
create table trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount
);
Importieren Sie CSV-Dateidaten nach postgresql
COPY trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount) FROM '/home/Documents/trip.csv' DELIMITER ',' CSV HEADER;
Finden Sie die angegebenen Tabellendaten
select * from trip.test;
IMHO ist der bequemste Weg, " CSV-Daten in postgresql importieren, den bequemen Weg ;-) " mit csvsql von csvkit , einem über pip installierbaren Python-Paket, zu folgen .
In Python können Sie diesen Code für die automatische Erstellung von PostgreSQL-Tabellen mit Spaltennamen verwenden:
import pandas, csv
from io import StringIO
from sqlalchemy import create_engine
def psql_insert_copy(table, conn, keys, data_iter):
dbapi_conn = conn.connection
with dbapi_conn.cursor() as cur:
s_buf = StringIO()
writer = csv.writer(s_buf)
writer.writerows(data_iter)
s_buf.seek(0)
columns = ', '.join('"{}"'.format(k) for k in keys)
if table.schema:
table_name = '{}.{}'.format(table.schema, table.name)
else:
table_name = table.name
sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(table_name, columns)
cur.copy_expert(sql=sql, file=s_buf)
engine = create_engine('postgresql://user:password@localhost:5432/my_db')
df = pandas.read_csv("my.csv")
df.to_sql('my_table', engine, schema='my_schema', method=psql_insert_copy)
Es ist auch relativ schnell, ich kann mehr als 3,3 Millionen Zeilen in ca. 4 Minuten importieren.
Sie können auch pgfutter oder noch besser pgcsv verwenden .
pgfutter ist ziemlich fehlerhaft, ich würde pgcsv empfehlen.
So geht's mit pgcsv:
sudo pip install pgcsv
pgcsv --db 'postgresql://localhost/postgres?user=postgres&password=...' my_table my_file.csv
Wenn Sie einen einfachen Mechanismus zum Importieren aus Text / Parse Multiline CSV benötigen, können Sie Folgendes verwenden:
CREATE TABLE t -- OR INSERT INTO tab(col_names)
AS
SELECT
t.f[1] AS col1
,t.f[2]::int AS col2
,t.f[3]::date AS col3
,t.f[4] AS col4
FROM (
SELECT regexp_split_to_array(l, ',') AS f
FROM regexp_split_to_table(
$$a,1,2016-01-01,bbb
c,2,2018-01-01,ddd
e,3,2019-01-01,eee$$, '\n') AS l) t;
Mit DBeaver Community Edition (dbeaver.io) ist es einfach, eine Verbindung zu einer Datenbank herzustellen und anschließend eine CSV-Datei zum Hochladen in eine PostgreSQL-Datenbank zu importieren. Es macht es auch einfach, Abfragen zu stellen, Daten abzurufen und Ergebnismengen in CSV, JSON, SQL oder andere gängige Datenformate herunterzuladen.
Es ist ein plattformübergreifendes Datenbank-Tool von FOSS für SQL-Programmierer, Datenbankadministratoren und Analysten, das alle gängigen Datenbanken unterstützt: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto usw. Es ist ein brauchbarer FOSS-Konkurrent von TOAD für Postgres, TOAD für SQL Server oder Toad für Oracle.
Ich bin nicht mit DBeaver verbunden. Ich mag den Preis (KOSTENLOS!) Und die volle Funktionalität, aber ich wünschte, sie würden diese DBeaver / Eclipse-Anwendung mehr öffnen und es einfacher machen, DBeaver / Eclipse Analyse-Widgets hinzuzufügen, anstatt dass Benutzer nur für das 199-Dollar-Jahresabonnement bezahlen müssen um Grafiken und Diagramme direkt in der Anwendung zu erstellen. Meine Java-Codierungsfähigkeiten sind verrostet und ich möchte keine Wochen brauchen, um neu zu lernen, wie man Eclipse-Widgets erstellt (nur um festzustellen, dass DBeaver wahrscheinlich die Möglichkeit deaktiviert hat, Widgets von Drittanbietern zur DBeaver Community Edition hinzuzufügen).
Können DBeaver-Hauptbenutzer, die Java-Entwickler sind, einen Einblick in die Schritte zum Erstellen von Analyse-Widgets geben, die der Community Edition von DBeaver hinzugefügt werden sollen?
Erstellen Sie eine Tabelle und benötigen Sie Spalten, die zum Erstellen einer Tabelle in einer CSV-Datei verwendet werden.
Öffnen Sie Postgres und der rechten Maustaste auf Zieltabelle , die Sie laden möchten und wählen Sie importieren und aktualisieren Sie die folgenden Schritte in Dateioptionen Abschnitt
Durchsuchen Sie nun Ihre Datei unter dem Dateinamen
Wählen Sie CSV im Format
Codierung als ISO_8859_5
Nun gehe zu Misc. Optionen und überprüfen Sie die Kopfzeile und klicken Sie auf Importieren.
Ich habe ein kleines Tool erstellt, das csv
Dateien super einfach in PostgreSQL importiert , nur einen Befehl, und es erstellt und füllt die Tabellen. Leider verwenden derzeit alle automatisch erstellten Felder den Typ TEXT
csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase
Das Tool finden Sie unter https://github.com/eduardonunesp/csv2pg
psql -h 192.168.99.100 -U postgres mydatabase -c "COPY users FROM 'users.csv' DELIMITER ';' CSV"
? Ich denke, der Teil, in dem die Tabelle erstellt wird, ist schön, aber da jedes Feld Text ist, ist es nicht besonders nützlich