有点模糊的标题,我会解释。
我正在编写一个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多个字段,一些可选,这意味着几乎不会生成任何脚本。
有没有办法解决这个问题?
答案 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