2017-12-08 10 views
0

csv 파일에 저장된 초기 데이터가있는 새로운 데이터베이스를 채우고 싶습니다. odo를 사용하여 csv 파일의 내용으로 기존 테이블을 채우려고했습니다. 내 파일에 기본 키가 없으며 데이터베이스에 추가 열이 정의되어 있으므로 열의 수가 일치하지 않습니다.기본 키없이 csv 파일을 sqlite3에 가져올 수있는 방법

어떻게 이것을 달성하기 위해 odo를 사용할 수 있습니까? 이 작동하지 않는

col A;col B 
aa;bb 
ax;bx 

:

from odo import odo 
odo('csvfile.csv', 
    'sqlite:///testdb.db::testtable', 
    has_header=True) 

오류 메시지 :

from sqlalchemy import Column, String, Integer, create_engine 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class Test(Base): 
    __tablename__ = 'testtable' 

    uid = Column(Integer, primary_key=True) 
    colA = Column(String(50)) 
    colB = Column(String(50)) 
    comment = Column(String(100)) 

engine = create_engine('sqlite:///testdb.db') 
Base.metadata.create_all(engine) 

내 csvfile은 다음과 같습니다

expected 4 columns but found 3 - filling the rest with NULL 
INSERT failed: datatype mismatch 
+0

어떻게 작동하지 않습니까? 오류가 있습니까? 그렇다면 질문에 포함 시키십시오. –

+0

관련 오류 메시지를 추가했습니다. 데이터베이스에서 정확한 수의 열과 일치하는 열 머리글이있는 csv 파일이있는 경우에도 동일한 방식으로 작동합니다. – Bjoern

+0

해결책은 아니지만 odo는 SQLite의 경우 실제 CSV에서 SQL 가져 오기에 SQLAlchemy를 사용하지 않습니다. https://github.com/blaze/odo/blob/master/odo/backends/sql_csv.py # L63. 이 오류는 ['.import csvfile.csv testtable'] (https://sqlite.org/cli.html#csv_import) 명령이 실패한 결과입니다. –

답변

0

을 초기 테이블을 보면 - 당신의 CSV를 두 개의 열과 세 번째 열 (li kely 기본 키)가 생성됩니다. 주석이 필요하지 않은지 (아래 예에서와 같이 기본 텍스트를 사용) 확인한 다음 각 값을 명시 적으로 데이터베이스 열에 넣거나 초기 채우기 중에 해당 열을 삭제하고 처음 채우기 후에 다시 작성하는 것을 고려하십시오.

다음은 각 값을 명시 적으로 각 열에 배치 한 예입니다. 이 사용할 수있는 열이 제공하는 입력의 수를 정렬하지 sqlite3를 문제를 해결

import csv 
# just my flavor...  

with open('csvfile.csv', 'r') as csvfile: 
    # Next three lines detect dialect 
    dialect = csv.Sniffer().sniff(csvfile.read(1024)) 
    # csvfile.seek(1,0) skips the first line of the file containing headers 
    csvfile.seek(1,0) 
    reader = csv.reader(csvfile, dialect) 

for line in reader: 
    A = line[0] 
    B = line[1] 
    rec = Test(colA=A, colB=B,comment='default text') 
    session.add(rec) 
    session.commit() 

데이터베이스가 채워집니다 때까지 주석을 사용하지 않는, 모두 함께 문제를 방지하려면 다음

class Test(Base): 
    __tablename__ = 'testtable' 
    uid = Column(Integer, primary_key=True) 
    colA = Column(String(50)) 
    colB = Column(String(50)) 

이렇게하면 odo를 데이터베이스를 채우는 수단으로 사용할 수 있습니다.