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)