用于创建插入脚本的SQL脚本

时间:2009-11-30 15:54:26

标签: sql postgresql

有点模糊的标题,我会解释。

我正在编写一个SQL脚本来为我的数据库中的每一行创建一个insert语句,纯粹是为了能够将该数据应用回另一个数据库。

这就是我现在所拥有的:

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 个答案:

答案 0 :(得分:13)

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

然后:

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

你已经完成了。它也更安全,更快。

答案 1 :(得分:5)

对于NULL字段,您可以执行类似

的操作
Select COALESCE(Name, '') from...

coalesce函数返回列表中的第一个非空值。

对于真正空白的字段(例如空的nvarchar),我相信上面的脚本可以正常工作。

答案 2 :(得分:4)

使用PostgreSQL 8.4中的quote_nullable()函数new。除了允许NULL值之外,它还保留您的数据类型并保护您免受Bobby Tables(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;

答案 3 :(得分:1)

我写了一个基于@intgr的python脚本来构造select语句。 它从stdin中使用逗号分隔的列列表(使用 - )。

我想使用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