2013-09-02 6 views
5

는 내가 파이썬 목록을 저장하는 SQL 데이터베이스를 가지고있다. 현재 나는 것 같다보관 파이썬 목록은

foo = [1,2,3] 
foo = str(foo) 

#Establish connection with database code here and get cursor 'cur' 

cur.execute("INSERT INTO Table VALUES(?, ?)", (uniqueKey, foo,)) 

데이터베이스에 즉 (사용 sqlite3를)를 문자열로 목록을 변환 한 후 삽입 이상한, 내 목록을 먼저 문자열로 변환 할 수있는 더 좋은 방법이 있나요?

+0

2 가지 방법. 1. 테이블을 정규화하십시오. 목록 값에 대해 새 테이블을 설정해야합니다. 그래서 당신은 "TABLE list (id)"와 "TABLE list_values ​​(list_id, value)"와 같은 것을 얻는다. 2. 목록을 직렬화 할 수 있습니다. 전의. Json, XML 등등 (SQL에서는 그다지 우수하지 않습니다). – user1759572

+0

당신은 얼룩으로 귀하의 목록을 저장할 수 있습니다 : http://stackoverflow.com/questions/537077/python-sqlite3-how-to-convert-a-list-to-a-blob-cell – alecxe

답변

5

(key, index, listitem)으로 (key, listdata) 테이블을 교체합니다. 테이블의 고유 키 대신 key(key, index)되고, 당신은 0

당신 월 또는 5 월에서 주어진 키 테이블의 인덱스의 집합 연속 시작임을 일관성 조건으로 보장 할 것 비어있는 키와 전혀 존재하지 않는 키를 구별 할 필요도 없습니다. 한 가지 방법은 두 개의 테이블 (목록 중 하나와 요소 중 하나)을 사용하여 비어 있지만 기존 목록이 자연스럽게 요소 테이블의 해당 행이없는 목록 테이블의 행으로 표시되도록하는 것입니다. 또 다른 방법은 그것을 바꿔서 index=null이라는 행이 해당 키에 대한 목록이 비어 있음을 의미한다고 말하는 것입니다.

SQL을 사용하여 목록의 요소 (예 : 테이블의 모든 목록의 마지막 요소를 가져 오는 쿼리 작성)에 대해 작업하려는 경우에만 유용합니다. 그렇게 할 필요가 없다면 이 완전히이 아니므로 목록을 DB에서 불투명 한 데이터로 처리하는 것이 바람직하지 않습니다. 당신은 DB가 그것을 "이해"하는 능력을 잃어 버리고 있습니다.

그러면 나머지 질문은 목록을 serialize/deserialize하는 것이 가장 좋습니다. str/eval이 작업을 수행하지만 조금 걱정됩니다. json.dumps/json.loads을 고려해보십시오. 정수 목록의 경우 구문 분석기에서 더 많은 안전 제한이있는 동일한 문자열 형식입니다. 또는 공간이 문제가되는 경우보다 컴팩트 한 이진 표현을 사용할 수 있습니다.

+1

고려해야 할 한가지는 OP는 DB에 인덱싱 된 목록을 저장하는 데 실제로 필요하지 않을 수도 있으며 데이터가 개념적으로 나중에 정렬 될 수있는 집합과 마찬가지로 작동 할 수도 있으므로 더 간단한 1 : N 관계를 사용할 수 있습니다. 나는. OP가 파이썬에서 "기본"콜렉션이기 때문에 OP를 나열하는 경우가있을 수 있습니다. 모든 행동이 필요하기 때문이 아닙니다. – millimoose

+1

@millimoose : 좋은 지적. 정렬에 1 : N 매핑이 필요하다면 (파이썬'set'처럼),'key' 컬럼이 비 고유화 될 필요가 있지만'index' 컬럼은 필요 없습니다. –

+0

스티브에게 감사드립니다, 이것은 실제로 내가 필요한 것입니다. 필자의 Python 목록은 날짜에 의해 색인 된 행이있는 2D 목록이므로 SQL 테이블에서'index' 값으로 사용하고 나머지는'listitem'에 불투명 한 데이터로 저장합니다. – rwolst

0

2 가지.

  1. 표준화 테이블, 당신은 목록 값에 대한 설정을 새 테이블이 필요합니다. 그래서 당신은 "TABLE list (id)"와 "TABLE list_values ​​(list_id, value)"와 같은 것을 얻는다.

  2. 목록을 직렬화하고 열을 입력 할 수 있습니다. 전의. Json, XML 등등 (SQL에서는 그다지 우수하지 않습니다).