使用Python批量导入/加载csv到sqlite

时间:2015-01-24 13:48:54

标签: python sqlite csv bulk-load

我已经搜索了一种使用python脚本将csv批量导入sqlite的方法。

目前我正在使用为csv的每一行运行的插入:

with open('file_name.csv','rb') as fin:
        Read_csv = csv.DictReader(fin) # comma is default delimiter
        to_db = [(i['col1'],i['col2'],i['col3']) for i in Read_csv]
        DbCur.executemany("INSERT INTO table (col1,col2,col3) values (?,?,?);",to_db)

我需要一种方法来批量插入整个数据,而不是逐行插入,我认为这不是非常优化的编码。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

假设您有一个这样的表:

class Sample(Base):
    __tablename__="Sample"
    X=Column(Integer, primary_key=True)
    Y=Column(Integer)
    Z=Column(Integer)

假设您在名为" test.csv"的文件中包含以下数据:

X,Y,Z
1,2,3
4,5,6

您可以进行批量导入,因为数据中没有重复项,现有表中没有重复项:

import pyexcel as pe

...
pe.save_as(file_name="test.csv", dest_session=session, dest_table=Sample)

以下是批量导入sqlite的完整代码:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column , Integer
from sqlalchemy.orm import sessionmaker
import pyexcel as pe

engine=create_engine("sqlite:///tmp.db")
Base=declarative_base()

class Sample(Base):
    __tablename__="Sample"
    X=Column(Integer, primary_key=True)
    Y=Column(Integer)
    Z=Column(Integer)

Session=sessionmaker(bind=engine)
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
session = Session()
# produce test csv
adict = {
    "X": [1, 4],
    "Y": [2, 5],
    "Z": [3, 6]
}
sheet = pe.get_sheet(adict=adict)
sheet.save_as("test.csv")
# end production
# bulk import
pe.save_as(file_name="test.csv", dest_session=session, dest_table=Sample)
result = pe.get_dict(session=session, table=Sample)

# verify result
print(result)

在现实世界中,列的类型不同,因此您可能需要在批量上传之前format your columns之后loading csv file