使用Flask SQLAlchamy和Python3将数百万行插入SQLite3表
如何使用Flask SQLAlchemy将.txt文件中的数百万行插入SQLite3数据库?我试着一次只从.txt文件中读取一行,并在循环中添加和提交它们,但注意到这需要花费大量的时间。我如何才能有效地做到这一点?我尝试在代码中实现此解决方案,但无法使其正常工作 表架构如下所示:使用Flask SQLAlchamy和Python3将数百万行插入SQLite3表,python,python-3.x,flask,sqlite,flask-sqlalchemy,Python,Python 3.x,Flask,Sqlite,Flask Sqlalchemy,如何使用Flask SQLAlchemy将.txt文件中的数百万行插入SQLite3数据库?我试着一次只从.txt文件中读取一行,并在循环中添加和提交它们,但注意到这需要花费大量的时间。我如何才能有效地做到这一点?我尝试在代码中实现此解决方案,但无法使其正常工作 表架构如下所示: class table(db.Model): id = db.Column(db.Integer, primary_key=True) col1 = db.Column(db.Integer)
class table(db.Model):
id = db.Column(db.Integer, primary_key=True)
col1 = db.Column(db.Integer)
col2 = db.Column(db.Integer)
col3 = db.Column(db.String(50))
col4 = db.Column(db.String(50))
col5 = db.Column(db.String(50))
col6 = db.Column(db.Integer)
col7 = db.Column(db.String(50))
col8 = db.Column(db.Integer)
col9 = db.Column(db.Integer)
col10 = db.Column(db.Integer)
col11 = db.Column(db.Integer)
col12 = db.Column(db.Integer)
.txt
文件中的行如下所示:
class table(db.Model):
id = db.Column(db.Integer, primary_key=True)
col1 = db.Column(db.Integer)
col2 = db.Column(db.Integer)
col3 = db.Column(db.String(50))
col4 = db.Column(db.String(50))
col5 = db.Column(db.String(50))
col6 = db.Column(db.Integer)
col7 = db.Column(db.String(50))
col8 = db.Column(db.Integer)
col9 = db.Column(db.Integer)
col10 = db.Column(db.Integer)
col11 = db.Column(db.Integer)
col12 = db.Column(db.Integer)
hjk;28770930;YTC建筑署;;1.1233;1233;0.00081103
还有大约8500万行要添加到数据库中。我找到了一种解决方案,可以显著加快事务处理速度。我使用的答案来自: 我使用
def chunks()
函数将文件划分为块并生成生成器,而不是一次读取一行,每次迭代写入一行。然后在asdasd
函数中,在块上循环,并在每个包含10000行的块之后提交
我仍然很想知道是否有人能想出一个更快的方法,因为这也需要大约5个小时
这是我的密码:
def chunks(data, n=10000):
buffer = [None] * n
idx = 0
for record in data:
buffer[idx] = record
idx += 1
if idx == n:
yield buffer
buffer = [None] * n
idx = 0
if idx > 0:
yield buffer[:idx]
def load_data_table(filename):
rows = 0
csvData = csv.reader(open('./folder/{}'.format(filename), "r"), delimiter=";")
dataset = tables.query.filter_by(id=1).first()
divData = chunks(csvData) # divide into 10000 rows each
for chunk in divData:
for col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12 in chunk:
add_new = table(col1=col1, col2=col2, col3=col3, col4=col4, col5=col5, col6=col6, col7=col7, col8=col8, col9=col9, col10=col10, col11=col11, col12=col12)
db.session.add(add_new)
db.session.commit()
rows += 10000
print(rows)
Plus、pandas+可能重复。只需删除所有的
commit()
调用,并在最后执行一次commit()
。@CL.我也尝试过,但它运行了一个多小时,没有达到提交要求。