Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Flask SQLAlchamy和Python3将数百万行插入SQLite3表_Python_Python 3.x_Flask_Sqlite_Flask Sqlalchemy - Fatal编程技术网

使用Flask SQLAlchamy和Python3将数百万行插入SQLite3表

使用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)

如何使用Flask SQLAlchemy将.txt文件中的数百万行插入SQLite3数据库?我试着一次只从.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)
.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.我也尝试过,但它运行了一个多小时,没有达到提交要求。