64 votes

Exemple d'insertion ou de mise à jour dans 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])

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

3 votes

Il n'y a pas d'insertion ou de mise à jour en SQL (standard). Vous devrez récupérer et mettre à jour manuellement les objets existants, puis insérer ceux qui n'existent pas encore. Sinon, vous devrez contourner l'ORM et émettre manuellement votre SQL dépendant du backend.

1 votes

@Ferdinand Beyer Ne serait-ce pas session.merge() ( sqlalchemy.org/docs/orm/session.html#merging ) fonctionne dans mon cas ?

3 votes

session.merge() fait quelque chose de complètement différent : il ajoute un objet à la session qui provient d'une autre session. Par exemple, s'il y a un objet avec l'ID 42, session.merge() va chercher une ligne pour l'ID 42 dans la base de données, et retournera un nouvel objet qui représente la même ligne de la base de données. Cela n'a rien à voir avec INSERT o UPDATE .

117voto

DJStroky Points 435

En supposant que certains noms de colonnes...

INSERER un

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

dbsession.add(newToner)   
dbsession.commit()

INSERT multiple

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

UPDATE

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

dbsession.commit()

ou en utilisant une phrase unique fantaisiste en utilisant MERGE

record = dbsession.merge(Toner( **kwargs))

3 votes

Où se trouve le dbsession viennent-ils de ? O.o est-il de create_engine() ?

0 votes

Donc, au cas où quelqu'un se demanderait où se trouve la dbsession vient, c'est probablement de Session() ou si vous avez une usine Session avec une pré-configuration, quelque chose comme MySession = sessionmaker(create_engine(...)) puis MySession() pour créer cette dbsession

0 votes

Le code de mise à jour obtiendra : sqlalchemy.exc.InvalidRequestError : Aucune transaction n'est commencée.

13voto

Ehsan Barkhordar Points 658

J'ai essayé de nombreuses façons et j'ai finalement essayé 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)

13 votes

Vous pourriez/devriez également ajouter session.close() dans le finally bloc de try-catch.

8voto

yurenchen Points 498

INSERT ON DUPLICATE KEY UPDATE

le sql :

INSERT INTO the_table (id, col1) VALUES (%s, %s) 
   ON DUPLICATE KEY UPDATE col1 = %s

dans le code py :
// test avec sqlalchemy 1.4.x, utiliser mysql

def test_insert_or_update():
    insert_stmt = insert(the_table).values(
        id = 'xxx',
        col1 = 'insert value',
    )
    on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(
        # col1 = insert_stmt.inserted.data,
        col1 = 'update value',
        col2 = 'mark'
    )
    print(on_duplicate_key_stmt)
    session.execute(on_duplicate_key_stmt)
    session.commit()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X