使用 Python 批量 import/load csv 到 sqlite
Bulk import/load csv to sqlite using Python
我已经搜索了一种使用 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)
我需要一种方法来批量插入整个数据,而不是逐行插入,我认为这不是非常优化的编码。
感谢任何帮助。
假设你有一个像这样的table:
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
您可以进行批量导入,前提是您的数据中没有重复项并且现有数据中也没有重复项table:
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 after loading csv file 在批量上传之前。
我已经搜索了一种使用 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)
我需要一种方法来批量插入整个数据,而不是逐行插入,我认为这不是非常优化的编码。 感谢任何帮助。
假设你有一个像这样的table:
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
您可以进行批量导入,前提是您的数据中没有重复项并且现有数据中也没有重复项table:
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 after loading csv file 在批量上传之前。