代码之家  ›  专栏  ›  技术社区  ›  Ben Everard

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

  •  12
  • Ben Everard  · 技术社区  · 15 年前

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

    我正在编写一个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 回复  |  直到 12 年前
        1
  •  5
  •   Chris Clark    15 年前

    对于空字段,可以执行如下操作

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

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

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

        2
  •  13
  •   user80168    15 年前
    pg_dump -a -U user1 -t products -f products.copy database1
    

    然后:

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

    你就完了。它也更安全更快。

        3
  •  4
  •   intgr    15 年前

    使用 quote_nullable() PostgreSQL 8.4中的函数new。除了允许空值之外,它还保留数据类型并保护您不受Bobby表(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;
    
        4
  •  1
  •   Adam Gent    12 年前

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

    我想用 sqlparse 但我不明白如何使用lib。

    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