Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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
Python 如何使用SQLAlchemy将成批条目提交到SQL数据库,并留有错误空间?_Python_Mysql_Sql_Sqlalchemy - Fatal编程技术网

Python 如何使用SQLAlchemy将成批条目提交到SQL数据库,并留有错误空间?

Python 如何使用SQLAlchemy将成批条目提交到SQL数据库,并留有错误空间?,python,mysql,sql,sqlalchemy,Python,Mysql,Sql,Sqlalchemy,我可以使用SQLAlchemy向SQL数据库提交哪些条目,并允许出错?同时提交一大批条目要高效得多,但如果其中一个条目(例如整数列中的文本)出现错误,则无法将整个批次保存到数据库中。我下面的解决方法是单独提交条目,但此方法可能会创建太多到mysql服务器的连接,尤其是在并行运行时。是否有一种更有效的方法可以将条目作为批提交,并留有出错的余地 def commitentry(database, enginetext, verbose = False): """ Takes a da

我可以使用SQLAlchemy向SQL数据库提交哪些条目,并允许出错?同时提交一大批条目要高效得多,但如果其中一个条目(例如整数列中的文本)出现错误,则无法将整个批次保存到数据库中。我下面的解决方法是单独提交条目,但此方法可能会创建太多到mysql服务器的连接,尤其是在并行运行时。是否有一种更有效的方法可以将条目作为批提交,并留有出错的余地

def commitentry(database, enginetext, verbose = False):
    """
    Takes a database object and text string that defines the SQL
    engine and adds all entries in the database list to the SQL
    database.
    """

    engine = create_engine(enginetext)
    Session = sessionmaker()
    Session.configure(bind=engine)
    session = Session()
    counter = 0
    for entry in database:
        try:
            session.add(entry)
            session.commit()

        except Exception, e:
            print("Commit Error")
            session.rollback()


            if verbose:
                print(e)

        finally:
            counter += 1
            if verbose:
                print(counter, counter/float(len(database)))

    if verbose:
        print("Entries saved!")
    session.close()

我认为你看的方向不对。据我所知,当单个条目中出现错误时,如果整个批次没有回滚,您无法避免提交批次

在添加到会话之前,您应该尝试捕获代码中的错误,即

batch_size = 500 
for i, entry in enumerate(database_list):
    try:
        validate(entry)
        #your custom function that validates the entry,
        #throws ValidationError on error and/or tries to 'fix' the entry
        session.add(entry)
    except ValidationError:
        pass
    if (i + 1) % batch_size == 0:
        #commit every `batch_size` entries
        session.commit()

最后,如果批量插入花费的时间太长,您可能希望使用
insert()
而不是
会话
API。

请重新安排问题的阶段。因为“Pythonic”是一个主观的想法,所以很难理解你在问什么。当有人问什么是“蟒蛇式”做事方式时,通常意味着他们在寻找“最佳”做事方式,因此,对你来说“最好”的东西对别人来说不是“最好”。如果你的代码工作,并且你在寻找代码上更一般的反馈,请考虑。问题更新了,并不是真的在寻找代码的审查,而是作为批量提交的一种方式。如果一个条目中有一个错误,一个可能的副本@ BVIDID非常肯定会崩溃。我认为你应该区分它们。你能解释一下使用
insert()
和使用
session
之间的区别吗?在中,它解释得非常清楚,并举例说明了如何使用这两种方法。