SQLAlchemy插入或更新示例

And*_*huk 44 python sqlalchemy

在Python中,使用SQLAlchemy,我想插入或更新一行.我试过这个:

existing = db.session.query(Toner)
for row in data:
    new = Toner(row[0], row[1], row[2])
Run Code Online (Sandbox Code Playgroud)

这是行不通的.如何newToner表中插入或更新?我怀疑它已经完成了合并,但我无法理解如何做到这一点.

Eva*_*oky 73

假设某些列名...

插入一个

newToner = Toner(toner_id = 1,
                    toner_color = 'blue',
                    toner_hex = '#0F85FF')

dbsession.add(newToner)   
dbsession.flush()
Run Code Online (Sandbox Code Playgroud)

插入多个

newToner1 = Toner(toner_id = 1,
                    toner_color = 'blue',
                    toner_hex = '#0F85FF')

newToner2 = Toner(toner_id = 2,
                    toner_color = 'red',
                    toner_hex = '#F01731')

dbsession.add_all([newToner1, newToner2])   
dbsession.flush()
Run Code Online (Sandbox Code Playgroud)

UPDATE

q = dbsession.query(Toner)
q = q.filter(Toner.toner_id==1)
record = q.one()
record.toner_color = 'Azure Radiance'

dbsession.flush()
Run Code Online (Sandbox Code Playgroud)

或使用MERGE的花式单线

record = dbsession.merge(Toner( **kwargs))
Run Code Online (Sandbox Code Playgroud)

  • `dbsession` 从哪里来?哦,是来自“create_engine()”吗? (5认同)
  • 因此,如果有人想知道“dbsession”来自哪里,它可能来自“Session()”,或者如果您有带有预配置的会话工厂,例如“MySession = sessionmaker(create_engine(...))”,那么“MySession” ()` 创建这个`dbsession` (2认同)

yur*_*hen 13

插入..重复密钥更新..

sql:

INSERT INTO the_table (id, col1) VALUES (%s, %s) 
   ON DUPLICATE KEY UPDATE col1 = %s
Run Code Online (Sandbox Code Playgroud)

在py代码中:
// 使用sqlalchemy 1.4.x进行测试,使用mysql

INSERT INTO the_table (id, col1) VALUES (%s, %s) 
   ON DUPLICATE KEY UPDATE col1 = %s
Run Code Online (Sandbox Code Playgroud)

注意:不同的 sql 方言可能有不同的 sql 语句(sqlalchemy 将处理该问题):

  • mysql:插入...重复
  • sqlite:插入...冲突
  • postgres9.4或greenplum6:不支持


Ehs*_*dar 6

我尝试了很多方法,最后尝试了以下方法:

def db_persist(func):
    def persist(*args, **kwargs):
        func(*args, **kwargs)
        try:
            session.commit()
            logger.info("success calling db func: " + func.__name__)
            return True
        except SQLAlchemyError as e:
            logger.error(e.args)
            session.rollback()
            return False

    return persist
Run Code Online (Sandbox Code Playgroud)

和:

@db_persist
def insert_or_update(table_object):
    return session.merge(table_object)
Run Code Online (Sandbox Code Playgroud)

  • 您还可以/也应该在try-catch的“ finally”块中添加“ session.close()”。 (5认同)