query python orm sqlalchemy declarative

python - query - Actualización de SQLAlchemy si existe una clave única



sqlalchemy relationship (2)

Tengo una clase:

class Tag(Base, TimestampMixin): """Tags""" __tablename__ = ''tags'' __table_args__ = {''mysql_engine'' : ''InnoDB'', ''mysql_charset'' : ''utf8'' } id = Column(Integer(11), autoincrement = True, primary_key = True) tag = Column(String(32), nullable = False, unique = True) cnt = Column(Integer(11), index = True, nullable = False, default = 1) def __init__(self, tag): t = session.query(Tag).filter_by(tag=tag).first() if t: self.cnt = t.cnt+1 self.tag = t.tag else: self.tag = tag def __repr__(self): return "<Tag(''%s'')>" % (self.tag, ) def __unicode__(self): return "%s" % (self.tag, )

Al agregar la etiqueta:

tag = Tag(''tag'') session.add(tag) session.commit()

Quiero que actualice la tag existente.

Por supuesto, podría haber hecho esto:

tag = session.query(Tag).filter_by(tag=''tag'').first() if tag: tag.cnt++ else: tag = Tag(''tag'') session.add(tag) session.commit()

pero, mantener esa lógica en la clase Tag parece ser más claro, posiblemente me mantenga alejado de la cirugía de disparo.

¿Como llego hasta ahí? Soy bastante nuevo en Python y SQLAlchemy , por lo que cualquier idea adicional sobre mi código será apreciada.

Gracias.

PS SQLAlchemy es TAN GIGANTE y no proporcionan una forma práctica de hacerlo INSERT ... ON DUPLICATE KEY UPDATE , ¿eh? ¡GUAUU!


Puedes intentar esto

def get_or_increase_tag(tag_name): tag = session.query(Tag).filter_by(tag=tag_name).first() if not tag: tag = Tag(tag_name) else: tag.cnt += 1 return tag

Puede consultar el enlace https://.com/search?q=Insert+on+duplicate+update+sqlalchemy


Desde la versión 1.2 SQLAlchemy será compatible con on_duplicate_key_update para MySQL

También hay ejemplos de cómo usarlo:

from sqlalchemy.dialects.mysql import insert insert_stmt = insert(my_table).values( id=''some_existing_id'', data=''inserted value'') on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update( data=insert_stmt.values.data, status=''U'' ) conn.execute(on_duplicate_key_stmt)

Desde la versión 1.1 Soporte de SQLAlchemy on_conflict_do_update para PostgreSQL

Ejemplos :

from sqlalchemy.dialects.postgresql import insert insert_stmt = insert(my_table).values( id=''some_existing_id'', data=''inserted value'') do_update_stmt = insert_stmt.on_conflict_do_update( constraint=''pk_my_table'', set_=dict(data=''updated value'') ) conn.execute(do_update_stmt)