1

me propuse a aprender algo de base de datos con python (antes había usado flask con sqlalchemy), la cosa es que quiero actualizar un elemento de la base de datos, con flask y sqlalchemy era simple solo actualizabas una clase y hacías el commit pero sin flask es mas complejo al parecer (no estoy seguro) se usa una función update() , En resumen busco saber como usar la funcion update() para editar el elemento, les dejo mi codigo

def AddProduc():
    producto = Producto()
    print ("\t\t .: Agregar Producto :. ")

    producto.product_id = raw_input("\t ID del producto ( codigo de barras ): ")
    Exist_Product = session.query( Producto ).filter_by( product_id = producto.product_id ).first()

    # AGREGAR O ACTUALIZAR 
    if Exist_Product == None:
        producto.nombre     = raw_input("\t Nombre del producto: ")
        producto.precio     = input("\t Precio del producto: ")
        producto.cantidad   = input("\t Cuantos productos va a agregar: ")
        session.add( producto )
        session.commit()
    else:
        Cantidad_Nuevo = input("\t Cuantos productos va a sumar: ")
        Cantidad_Nuevo = Cantidad_Nuevo + Exist_Product.cantidad
        # Lo que esta adentro de update() es el nombre de la tabla no la clase
        session.update( producto ).values( cantidad = Cantidad_Nuevo ).where()

La tabla esta declarada asi:

class Producto( db ):
    __tablename__ = "producto"

    product_id  = Column( Integer(),primary_key = True )
    precio      = Column( Integer())
    cantidad    = Column( Integer())
    nombre      = Column( String(50))

Gracias de antemano <3

Frijolito
  • 382
  • 1
  • 2
  • 13

1 Answers1

1

Tienes varias formas de actualizar el campo, por ejemplo:

  • Modificar directamente el atributo del objeto:

    exist_product.cantidad = Producto.cantidad + cantidad_nuevo
    session.commit()
    
  • sqlalchemy.orm.query.Query.update

    (session.query(Producto)
            .filter_by(product_id=product_id)
            .update({"cantidad": Producto.cantidad + cantidad_nuevo})
            )
    session.commit(
    

    Este método está pensado para consultas masivas y hay que tener en cuenta algunos peligros asociados a su uso. Ver documentación.)

  • sqlalchemy.sql.expression.update / sqlalchemy.schema.Table.update:

    from sqlalchemy import update
    
    
    stmt = (update(Producto)
                .where(Producto.product_id == product_id)
                .values(cantidad=Producto.cantidad + cantidad_nuevo)
                 )
    session.execute(stmt)
    session.commit()
    

Ejemplo completo reproducible basado en el código de la pregunta y usando sqlite3:

from sqlalchemy import Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import update


Base = declarative_base()


class Producto(Base):
    __tablename__ = "producto"

    product_id = Column(Integer(), primary_key=True)
    precio = Column(Integer())
    cantidad = Column(Integer())
    nombre = Column(String(50))


engine = create_engine('sqlite:///example.sqlite')
session_maker = sessionmaker()
session_maker.configure(bind=engine)
Base.metadata.create_all(engine)
session = session_maker()


def add_produc():
    print("\t\t .: Agregar Producto :. ")

    product_id = raw_input("\t ID del producto ( codigo de barras ): ")
    exist_product = (session.query(Producto)
                            .filter_by(product_id=product_id)
                            .first()
                     )

    # AGREGAR O ACTUALIZAR
    if exist_product is None:
        producto = Producto()
        producto.product_id = product_id
        producto.nombre = raw_input("\t Nombre del producto: ")
        producto.precio = int(raw_input("\t Precio del producto: "))
        producto.cantidad = int(raw_input("\t Cuantos productos va a agregar: "))
        session.add(producto)
        session.commit()

    else:
        cantidad_nuevo = int(raw_input("\t Cuantos productos va a sumar: "))
        exist_product.cantidad = Producto.cantidad + cantidad_nuevo
        session.commit()


add_produc()

Unas pequeñas observaciones:

  • La forma correcta de saber si un objeto es None es usando el operador is, no el operador de igualdad:

    if exist_product == None:  # No
    if exist_product is None:  # Si
    
  • Como norma general no uses input para entradas de usuario en Python 2, no es para ingresar valores numéricos. Usa raw_input y un casting explicito a int.

  • Es buena idea que sigas las convenciones de estilo definidas en PEP 8 en lo posible. Los nombres de las variables, métodos y funciones deben ser en minúscula y usando _ para separar palabras. Reservar CamelCase para las clases y todo en mayúsculas para las "constantes".

El código es para Python 2 que es el usado en la pregunta, pero basta con cambiar raw_input por input o establece un alias al inicio:

raw_input = input

para que pueda ser utilizado en Python 3.

FJSevilla
  • 55,603
  • 7
  • 35
  • 58
  • Muchas gracias por tu comentario me ayudo mucho y también lo de las observaciones me ayudaron mucho, aunque me quedo una duda en la parte de `exist_product.cantidad = Producto.cantidad + cantidad_nuevo`, porque se usa `Producto.cantidad`, y no `exist_product.cantidad` para sumarse a si mismo, Muchas gracias <3 – Frijolito Aug 11 '19 at 19:57