web-dev-qa-db-fra.com

Exemple d'insertion ou de mise à jour SQLAlchemy

En Python, en utilisant SQLAlchemy, je veux insérer ou mettre à jour une ligne. J'ai essayé ceci:

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

Ça ne marche pas. Comment puis-je INSÉRER ou METTRE À JOUR new dans la table Toner? Je soupçonne que c'est fait avec la fusion, mais je ne comprends pas comment faire cela.

38
Andrii Yurchuk

en supposant que certains noms de colonne ...

INSÉRER un

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

dbsession.add(newToner)   
dbsession.flush()

INSÉRER plusieurs

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()

[~ # ~] mise à jour [~ # ~]

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

dbsession.flush()

ou en utilisant une doublure fantaisie en utilisant FUSIONNER

record = dbsession.merge(Toner( **kwargs))
69
Evan Siroky

J'essaie de nombreuses façons et finalement j'essaye ceci:

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

et :

@db_persist
def insert_or_update(table_object):
    return session.merge(table_object)
5
Ehsan Barkhordar