2012-12-21 1 views
1

나는 하나의 데이터베이스에서 다른 데이터베이스로 데이터를 복사하는 데 문제가 있습니다. 여기에 파이썬 코드가 있습니다. 여기 cursor.copy_from가 postgres에서 실패했습니다

import psycopg2 

db = psycopg2.connect("dbname='db' user='xx' password='xx' host='127.0.0.2'") 
st = db.cursor(); 

db_l = psycopg2.connect("dbname='xx' user='xx' password='xx' host='127.0.0.1'") 
st_l = db_l.cursor(); 


q = "create table tarf as select i_rate, i_tariff As id, prefix, price_1, price_n, interval_1, interval_n, '00:00' AS start_time, '23:59:59' AS end_time, activation_dat 
e, '3049-1-1 00:00' as exp from rates JOIN tariffs USING (i_tariff) JOIN billing_plans USING(i_tariff) JOIN accounts using (i_billing_plan)" 

st_l.execute(q) 

f = open('tariff.sql','w') 
st_l.copy_to(f,'tarf',sep=',') 

st.copy_from(f,'tariff',sep=',') 

오류가 직면 : 다음

Traceback (most recent call last): 
    File "sync_tariff.py", line 23, in <module> 
    st.copy_from(f,'tariff',sep=',') 
psycopg2.extensions.QueryCanceledError: COPY from stdin failed: error in .read() call 
CONTEXT: COPY tariff, line 1 

답변

1

닫기 파일과 당신의 대답을

f = open('tariff.sql', 'w') 
st_l.copy_to(f, 'tarf', sep=',') 

f.close() 

f = open('tariff.sql', 'r') 
st.copy_from(f, 'tariff', sep=',') 
+0

감사를 읽기 위해 엽니 다. 디스크에 데이터를 쓰지 않고 st_l에서 st로 C#의 FileStream과 같이 전송할 수있는 방법이 있습니다. 중요한 점은 cursor.copy_to가 쿼리를 지원하지 않지만 테이블 이름을 사용하고 쿼리에서 복사하여 임시 테이블을 만드는 것입니다. psql의 "\ copy (query) TO 'filepath'"가 약 10 초 동안 23 초 동안 cursor.copy_to에서 쿼리를 사용할 수있는 방법이 있습니다. 나는 이것을 터미널을 에뮬레이트하여 사용했지만 권장 된 방법은 아니 었습니다. – sharafjaffri

+0

@sharafjaffri 데이터 전송을 위해서 파이썬을 사용하고 있습니까? dblink 또는 psql 파이핑을 사용할 수 있습니다. 그것에 대해 다른 질문을여십시오. –

관련 문제