我的问题是:
我有一个文件,里面有几行数据。我想尝试将每一行插入我的数据库,但是如果任何行出现问题,我需要回滚整个工具包和kaboodle。但我想跟踪实际的错误,所以我可以这样说,而不是死在第一个有错误的记录上:
This file has 42 errors in it.
Line 1 is missing a whirlygig. Line 2 is a duplicate. Line 5 is right out.
我尝试的方法是使用事务,但是我有一个问题,即SQLAlchemy在select上创建隐式事务,而且显然我并不真正理解SQLAlchemy是如何使用事务的,因为我所做的似乎都没有按照我想要的方式工作。下面是一些代码来说明我的问题:
import sqlalchemy as sa
import logging
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
l = logging.getLogger('sqlalchemy.engine')
l.setLevel(logging.INFO)
l.addHandler(logging.StreamHandler())
engine = sa.create_engine('YOUR PG CONNECTION HERE')
Session = sessionmaker(bind=engine)
session = Session()
temp_metadata = sa.MetaData(schema='pg_temp')
TempBase = declarative_base(metadata=temp_metadata)
class Whatever(TempBase):
__tablename__ = 'whatevs'
id = sa.Column('id', sa.Integer, primary_key=True, autoincrement=True)
fnord = sa.Column('fnord', sa.String, server_default=sa.schema.FetchedValue())
quux = sa.Column('quux', sa.String)
value = sa.Column('value', sa.String)
def insert_some_stuff(session, data):
value = session.query(Whatever.value).limit(1).scalar()
session.add(Whatever(quux=data, value='hi'))
try:
session.commit()
errors = 0
except sa.exc.IntegrityError:
session.rollback()
errors = 1
return errors
with session.begin_nested():
session.execute('''
CREATE TABLE pg_temp.whatevs (
id serial
, fnord text not null default 'fnord'
, quux text not null
, value text not null
, CONSTRAINT totally_unique UNIQUE (quux)
);
INSERT INTO pg_temp.whatevs (value, quux) VALUES ('something cool', 'fnord');
''')
w = Whatever(value='something cool', quux='herp')
session.add(w)
errors = 0
for q in ('foo', 'biz', 'bang', 'herp'):
with session.begin_nested():
errors += insert_some_stuff(session, q)
for row in session.query(Whatever).all():
print(row.id, row.fnord, row.value)
我尝试过多种组合,其中包括session.begin()
或{
我可以阻止sqlalchemy在select上创建事务吗?还是我在这里遗漏了什么?有没有更好的方法来完成我想要的?在
看起来
begin_nested
和with
块是正确的选择。在这使我相信
begin_nested
是首选。在通过使用
with
块,它做了正确的事情™ 当涉及到提交/回滚时,不要回滚太远。在相关问题 更多 >
编程相关推荐