2017-12-08 20 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ファイルを2つの列と3つの列があります(liプライマリキーに依存します)が生成されています。コメントが不要であることを確認するか(または下の例のようにデフォルトのテキストを使用)、各値をデータベース列に明示的に入力するか、最初の入力時にその列を削除し、最初に入力した後に再作成します。

それぞれの値をそれぞれの列に明示的に配置する例を示します。これは、使用可能な列を提供する入力の数を合わせない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をデータベースに移入する手段として使用できるようになります。

関連する問題