SQL скрипт для создания скрипта вставки - PullRequest
12 голосов
/ 30 ноября 2009

Немного смутное название, я объясню.

Я пишу сценарий SQL для создания оператора вставки для каждой строки таблицы в моей базе данных, чтобы иметь возможность применить эти данные обратно к другой базе данных.

Вот что у меня есть на данный момент:

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

И это прекрасно работает, выводя это:

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');

Проблема в том, что если одно из полей пусто, строка не сможет создать скрипт обновления, в выходном файле строка будет просто пустой. Очевидно, что поскольку есть более 20 полей, некоторые необязательные, это означает, что почти ни один из моих сценариев не создается.

Есть ли способ решить эту проблему?

Ответы [ 4 ]

13 голосов
/ 30 ноября 2009
pg_dump -a -U user1 -t products -f products.copy database1

и затем:

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

и все готово. Это также безопаснее и быстрее.

5 голосов
/ 30 ноября 2009

В случае полей NULL вы можете сделать что-то вроде

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

Функция coalesce возвращает первое ненулевое значение в списке.

Для действительно пустых полей (например, пустого nvarchar), ваш скрипт выше будет работать.

4 голосов
/ 30 ноября 2009

Используйте функцию quote_nullable(), новую в PostgreSQL 8.4. Помимо разрешения значений NULL, он сохраняет ваши типы данных и защищает вас от таблиц Бобби (SQL-инъекций):

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

В более старых версиях вы получаете то же поведение с coalesce() и 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;
1 голос
/ 01 мая 2012

Я написал скрипт на python, основанный на ответе @intgr, для построения оператора select. Он принимает разделенный запятыми список столбцов из stdin (use -).

Я хотел использовать sqlparse , но не мог понять, как использовать эту библиотеку.

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

Суть сценария здесь: https://gist.github.com/2568047

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...