Lez*_*zan 10 python transactions sqlalchemy insert
我试图弄清楚如何使用python3中的sqlalchemy将许多(大约100k)记录插入到数据库中.一切都指向使用交易,但是我对如何做到这一点感到有些困惑.有些页面声明你从connection.begin()获得了一个事务,其他地方说它是session.begin(),这里的这个页面说它是session.create_transaction(),它不存在.
这是我想要做的:
def addToTable(listOfRows):
engine = create_engine('postgresql+pypostgresql:///%s' % db,echo = False)
Session = sessionmaker(bind = engine)
session = Session()
table = myTable(engine,session)
for row in listOfRows:
table.add(row)
table.flush() ### ideally there would be a counter and you flush after a couple of thousand records
class myTable:
def __init__(self,engine,session):
self.engine = engine
self.session = session
self.transaction =createTransaction()# Create transaction code here
def add(self,row):
newRow = tableRow(row) ## This just creates a representation of a row in the DB
self.transaction.add(newRow)
self.transaction.flush()
def flush(self):
self.transaction.commit()
Run Code Online (Sandbox Code Playgroud)
jav*_*vex 23
我强烈建议您在继续使用SQLAlchemy之前完成这两个教程.他们真的很有帮助并解释了许多概念.之后,我建议您阅读使用会话,然后继续解释会话如何适应所有这些.
对于您的问题,有两种解决方案:一种使用ORM,另一种使用Core.前者更容易,后者更快.让我们先走简单的路.事务仅用于将所有语句包装到单个操作中.也就是说,如果某些内容失败,您可以中止所有内容,并且不会留下介于两者之间的内容.所以你很可能想要一个交易,但没有一个交易就行.这是最快捷的方式:
with session.begin():
session.add_all([tableRow(row) for row in listOfRows])
Run Code Online (Sandbox Code Playgroud)
根据您的数据,SQLAlchemy甚至可以以INSERT一次执行多个语句的方式优化您的语句.这是正在发生的事情:
session.beginadd_all,但多个循环add也可以)所以这显然是一种好方法,但它不是最快的方法,因为SQLAlchemy必须经历所有可能产生一定开销的ORM算法.如果这是一次性数据库初始化,则可以避免使用ORM.在这种情况下,不是创建ORM类(tableRow),而是创建一个包含所有键的字典(如何依赖于数据).您可以再次使用上下文管理器:
with engine.begin() as connection:
connection.execute(tableRow.__table__.insert().
values([row_to_dict(row) for row in listOfRows]))
Run Code Online (Sandbox Code Playgroud)
这很可能会稍快但也不方便.它的工作方式与上面的会话相同,只是它从Core而不是ORM构造语句.
更新 2020-01-23
@javex 的答案已经过时了。
TLDR:您可以直接使用会话而无需调用begin. 只要确保autocommit设置为false
长答案:
请参阅会话文档 https://docs.sqlalchemy.org/en/13/orm/session_api.html
警告
Session.begin() 方法是与 Session 一起使用的更大模式的一部分,称为自动提交模式。这本质上是一种传统的使用模式,对于新应用程序来说不是必需的。Session 通常透明地处理“开始”的工作,而后者又依赖 Python DBAPI 来透明地“开始”事务;使用现代会话编程模式时,无需显式开始事务。在 autocommit=False 的默认模式下,Session 在事务的上下文中完成其所有工作,因此只要您调用 Session.commit(),当调用下一个数据库操作时,下一个事务就会隐式启动。有关更多背景信息,请参阅自动提交模式。
| 归档时间: |
|
| 查看次数: |
12382 次 |
| 最近记录: |