2016-08-29 4 views
0

python 3+에서 사전 (또는 팬더 데이터 프레임)의 값을 데이터베이스에 삽입하고 싶습니다. 나는 postgres 데이터베이스로 psycopg2를 선택했다.Psycopg2 postgres 데이터베이스에 파이썬 사전 삽입

문제는이 작업을 수행 할 수있는 적절한 방법을 찾을 수 없다는 것입니다. SQL 문자열을 쉽게 연결하여 실행할 수는 있지만 psycopg2 설명서는이를 명시 적으로 경고합니다. 이상적으로는 다음과 같이하고 싶었던 :

cur.execute("INSERT INTO table VALUES (%s);", dict_data) 

및하여 딕셔너리의 키 테이블의 열을 일치하는지 알아낼 수 실행할 것을 희망했다. 이것은 작동하지 않았다. psycopg2 문서의 예에서 나는이 방법 나는

TypeError: 'dict' object does not support indexing 

열 이름이 일치하는 테이블에 사전을 삽입하는 가장 phytonic 방법은 무엇을 얻을 수있는

cur.execute("INSERT INTO table (" + ", ".join(dict_data.keys()) + ") VALUES (" + ", ".join(["%s" for pair in dict_data]) + ");", dict_data) 

에있어?

답변

3

두 솔루션 :

d = {'k1': 'v1', 'k2': 'v2'} 

insert = 'insert into table (%s) values %s' 
l = [(c, v) for c, v in d.items()] 
columns = ','.join([t[0] for t in l]) 
values = tuple([t[1] for t in l]) 
cursor = conn.cursor() 
print cursor.mogrify(insert, ([AsIs(columns)] + [values])) 

keys = d.keys() 
columns = ','.join(keys) 
values = ','.join(['%({})s'.format(k) for k in keys]) 
insert = 'insert into table ({0}) values ({1})'.format(columns, values) 
print cursor.mogrify(insert, d) 

출력 : 제안 된 SQL 대이의

insert into table (k2,k1) values ('v2', 'v1') 
insert into table (k2,k1) values ('v2','v1') 
+0

장점/단점? 두 번째 해결책은 기본적으로 제안 된 것과 동일합니다 (문자열 형식과 합성 제외). Afaik cur.execute는 필요한 경우 cur.mogrify를 호출합니까? – Paamand

0

[추천 받기/해결 방법 - 더 나은 답변을 부탁드립니다! 일부 시험 후

/오류 내가받은 일 다음이 SQL 문자열을 제공

sql = "INSERT INTO table (" + ", ".join(dict_data.keys()) + ") VALUES (" + ", ".join(["%("+k+")s" for k in dict_data]) + ");" 

"INSERT INTO table (k1, k2, ... , kn) VALUES (%(k1)s, %(k2)s, ... , %(kn)s);" 

게시물/죄송합니다.

관련 문제