2009-11-30 9 views
10

Ein bisschen ein vages Titel, werde ich erklären.SQL-Skript zum Erstellen einfügen Skript

Ich schreibe ein SQL-Skript, um eine Insert-Anweisung für jede Zeile einer Tabelle in meiner Datenbank zu erstellen, nur um diese Daten wieder auf eine andere Datenbank anwenden zu können. Hier

ist das, was ich im Moment haben:

SELECT 'INSERT INTO products (id,name,description) VALUES ('||ID||','''||name||''','''||description||''');' FROM products 

Und es funktioniert gut, diese Ausgabe von:

INSERT INTO products (id,name,description) VALUES (1,'Lorem','Ipsum'); 
INSERT INTO products (id,name,description) VALUES (2,'Lorem','Ipsum'); 
INSERT INTO products (id,name,description) VALUES (3,'Lorem','Ipsum'); 
INSERT INTO products (id,name,description) VALUES (4,'Lorem','Ipsum'); 

Das Problem ist, wenn eines der Felder leer ist, dass Zeile fehl Erstellen Sie ein Update-Skript, in der Ausgabedatei ist die Zeile leer. Offensichtlich, da es 20+ Felder gibt, einige optionale, bedeutet dies, dass kaum eines meiner Skripte generiert wird.

Gibt es eine Möglichkeit, dieses Problem zu lösen?

Antwort

5

im Fall von NULL-Feldern können Sie so etwas wie

Select COALESCE(Name, '') from... 

die coalesce Funktion den ersten ungleich NULL Wert in der Liste zurück zu tun.

Für wirklich leere Felder (leere nvarchar zum Beispiel) Ich glaube, dass Ihr Skript oben funktioniert.

+0

Prost Chris, das hat super funktioniert. –

+0

Ich möchte Sie warnen, dass dies von SQL-Injektionen nicht sicher ist. Ein einzelner Apostroph in einer Spalte führt zu Fehlern in der resultierenden SQL oder kann von einem Angreifer zum Ausführen beliebiger Abfragen in der Datenbank ausgenutzt werden. – intgr

+2

Dies erzeugt auch nicht die gleichen exakten Zeilen. Die Koaleszenz wie oben wird am Ende leere String-Werte einfügen, wo NULL-Werte eingefügt werden sollen. –

4

Verwenden Sie die Funktion quote_nullable() neu in PostgreSQL 8.4. Zusätzlich NULL-Werte zulässt, es behält Ihre Datentypen und schützt Sie vor Bobby Tabellen (SQL-Injektionen):

SELECT 'INSERT INTO products (id,name,description) VALUES (' || 
quote_nullable(ID) || ',' || quote_nullable(name) || ',' || 
quote_nullable(description) || ');' FROM products; 

In älteren Versionen erhalten Sie das gleiche Verhalten mit coalesce() und quote_literal():

SELECT 'INSERT INTO products (id,name,description) VALUES (' || 
coalesce(quote_literal(ID), 'null') || ',' || 
coalesce(quote_literal(name), 'null') || ',' || 
coalesce(quote_literal(description), 'null') || ',' || 
');' FROM products; 
+0

Vielen Dank für Ihre Antwort, aber ich erhalte eine Fehlermeldung, dass die Funktion quote_nullable existiert nicht. Trotzdem hat Chris Clarks Lösung funktioniert. Nochmals vielen Dank. –

+0

D'oh, 'quote_nullable()' ist neu in PostgreSQL 8.4 – intgr

13
pg_dump -a -U user1 -t products -f products.copy database1 

und dann:

psql -U user2 -d database2 -f products.copy 

und du bist fertig. Es ist auch sicherer und schneller.

1

Ich schrieb ein Python-Skript basierend auf @intgr Antwort, um die Select-Anweisung zu konstruieren. Es braucht Komma getrennte Liste von Spalten von Stdin (Use -).

Ich wollte verwenden, aber ich konnte nicht verstehen, wie diese lib zu verwenden ist.

import fileinput 

names = ' '.join(fileinput.input()) 

ns = [x.strip() for x in names.split(',')] 
quoted = ['quote_nullable(' + x + ')' for x in ns] 
insert = "SELECT 'INSERT INTO <TABLE> (" + (', ').join(ns) + ") VALUES(' || " + (" || ',' || ").join(quoted) + " || ');' FROM <TABLE>" 
print insert 

Ein Kern des Skriptes ist hier: https://gist.github.com/2568047

Verwandte Themen