2009-11-30 4 views
10

모호한 제목의 비트를 설명하겠습니다.삽입 스크립트를 작성하는 SQL 스크립트

데이터베이스에있는 테이블의 각 행에 대한 insert 문을 작성하기 위해 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 개 이상의 필드가 있으므로 일부 옵션은 내 스크립트가 거의 생성되지 않는다는 것을 의미합니다.

이 문제를 해결할 방법이 있습니까?

답변

5
병합 기능이 목록의 첫 번째 널 (null)이 아닌 값을 반환 뭔가
Select COALESCE(Name, '') from... 

처럼

은 NULL 필드의 경우, 당신은 할 수 있습니다.

빈 필드 (예 : 빈 nvarchar)에 대해서는 위의 스크립트가 작동한다고 생각합니다.

+0

Chris,이 기능은 훌륭했습니다. –

+0

SQL 인젝션으로 인해 안전하지 않다는 경고를하고 싶습니다. 하나의 아포스트로피가 하나의 열에 나타나면 결과 SQL이 엉망이되거나 공격자가 데이터베이스에서 임의의 쿼리를 실행할 수 있습니다. – intgr

+2

또한 동일한 정확한 행을 생성하지 않습니다. 위와 같이 병합하면 NULL 값을 삽입해야하는 빈 문자열 값이 삽입됩니다. –

4

PostgreSQL 8.4의 새로운 기능 quote_nullable()을 사용하십시오. 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; 
+0

많은 감사합니다,하지만 난 함수 quote_nullable가 존재하지 않는 오류를 얻을 :

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 

스크립트의 요점은 여기에있다. 그럼에도 불구하고 Chris Clarks 솔루션이 효과를 발휘했습니다. 다시 한번, 많은 감사합니다. –

+0

D' oh,'quote_nullable()'은 PostgreSQL 8.4의 새로운 기능입니다. – intgr

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

다음 :

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

당신이 완료됩니다. 또한 더 안전하고 빠릅니다.

1

@intgr answer를 기반으로 python 스크립트를 작성하여 select 문을 생성했습니다. stdin에서 쉼표로 구분 된 열 목록을 사용합니다 (-).

sqlparse을 사용하고 싶었지만 그 lib를 사용하는 방법을 이해할 수 없었습니다. 당신의 응답을 https://gist.github.com/2568047

관련 문제