Foros del Web » Programando para Internet » Python »

Duda for y concatenar para llenar datos en una tabla

Estas en el tema de Duda for y concatenar para llenar datos en una tabla en el foro de Python en Foros del Web. Buenas, a fuerza de ensayo y error y de leer tutoriales creo que vengo aprendiendo Tengo una base de datos y esta una tabla con ...
  #1 (permalink)  
Antiguo 18/12/2012, 14:15
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Duda for y concatenar para llenar datos en una tabla

Buenas, a fuerza de ensayo y error y de leer tutoriales creo que vengo aprendiendo

Tengo una base de datos y esta una tabla con datos de usuarios.

Necesito automatizar el llenado inicial usando un FOR pero el tema de como concatenar me está complicando.

La tabla es algo como:
Código:
class Usuario(Base):
    __tablename__ = 'usuarios'
    id = Column(Integer, primary_key=True)
    name = Column(String(10))
    active = Column(String(1))
Donde id es un número secuencial, 1, 2, 3, etc...
name es siempre "Usuario1" para el primer caso, "Usuario2" para el segundo, etc...
y active inicialmente es "N" (porque creo entender que SQL no admite booleans, así que controlaré si un usuario está activo o no con "S" o "N")

Bueno la idea es automatizar este ciclo:

Código:
def InicioUsuarios():
    # Inicio la cantidad de usuarios
    engine.execute("INSERT INTO usuarios VALUES (1,'Usuario1','N')")
    engine.execute("INSERT INTO usuarios VALUES (2,'Usuario2','N')")
    engine.execute("INSERT INTO usuarios VALUES (3,'Usuario3','N')")
    engine.execute("INSERT INTO usuarios VALUES (4,'Usuario4','N')")
    engine.execute("INSERT INTO usuarios VALUES (5,'Usuario5','N')")
para una cantidad cualquiera de usuarios, o sea que si defino

maxusuarios = 50

que el FOR me llene los datos de esos 50 usuarios

Lo que me complica es como concateno el 'Usuario1' que en realidad es la cadena 'Usuario' + el número que corresponda del FOR....

Mi idea es algo como:

Código:
def InicioUsuarios()
    for x in range(maxusuarios+1):
         engine.execute("INSERT INTO usuarios VALUES (x,'Usuariox','N')"
pero preciso cambiar 'Usuariox' por algo como 'Usuario'+STR(x) ???
  #2 (permalink)  
Antiguo 18/12/2012, 14:46
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda for y concatenar para llenar datos en una tabla

Veo que estas usando SQLAlchemy, excelente opción, pero veo que no estas haciendo uso adecuado del ORM.

Lo ideal seria hacer lo siguiente.
Código Python:
Ver original
  1. from sqlalchemy.orm import sessionmaker
  2. from sqlalchemy import create_engine
  3.  
  4. Session = sessionmaker()
  5. engine = create_engine('postgresql://...')
  6. Session.configure(bind=engine)
  7. session = Session()
  8.  
  9. for i in xrange(1, 5 + 1):
  10.     usr = Usuario(id=i, name="Usuario{0}".format(i), active='N')
  11.     session.add(usr)
  12. session.commit()
  #3 (permalink)  
Antiguo 18/12/2012, 16:50
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: Duda for y concatenar para llenar datos en una tabla

Cita:
Iniciado por razpeitia Ver Mensaje
Veo que estas usando SQLAlchemy, excelente opción, pero veo que no estas haciendo uso adecuado del ORM.

Lo ideal seria hacer lo siguiente.
Código Python:
Ver original
  1. from sqlalchemy.orm import sessionmaker
  2. from sqlalchemy import create_engine
  3.  
  4. Session = sessionmaker()
  5. engine = create_engine('postgresql://...')
  6. Session.configure(bind=engine)
  7. session = Session()
  8.  
  9. for i in xrange(1, 5 + 1):
  10.     usr = Usuario(id=i, name="Usuario{0}".format(i), active='N')
  11.     session.add(usr)
  12. session.commit()
Muchas gracias por responder.

El FOR se ve muy limpio, pero el código me tira este error:

TypeError: __init__() got an unexpected keyword argument 'id'

como si no reconociera el campo id asignado en el FOR, sin embargo está definido en la propia creación de la tabla

???
  #4 (permalink)  
Antiguo 18/12/2012, 16:53
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda for y concatenar para llenar datos en una tabla

Espero que tengas un constructor para la clase Usuario. Si no es asi eso puede explicar el error.
  #5 (permalink)  
Antiguo 19/12/2012, 05:08
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: Duda for y concatenar para llenar datos en una tabla

Cita:
Iniciado por razpeitia Ver Mensaje
Espero que tengas un constructor para la clase Usuario. Si no es asi eso puede explicar el error.
Si, tengo un constructor y de hecho funciona cuando hago la inicialización manualmente

Código:
engine.execute("INSERT INTO usuarios VALUES (1,'Usuario 1','S')")
engine.execute("INSERT INTO usuarios VALUES (2,'Usuario 2','S')")
lo que yo tengo diferente a tu ejemplo son las órdenes bind=engine que no se bien que son, las copié de un ejemplo que encontré en un foro

yo tengo así:

Código:
Session = sessionmaker()
engine = create_engine('sqlite:///db.usuarios', echo=False)
Session.configure(bind=engine)
session = Session()
Base = declarative_base()
  #6 (permalink)  
Antiguo 19/12/2012, 10:29
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda for y concatenar para llenar datos en una tabla

Después de jugar un poco en un script y dado que no presentaste la clase usuario me arme este pequeño script.

Código Python:
Ver original
  1. from sqlalchemy import create_engine
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy import Column, Integer, String
  4. from sqlalchemy.orm import sessionmaker
  5. from sqlalchemy.exc import IntegrityError
  6.  
  7. engine = create_engine('sqlite:///db.sqlite3', echo=False)
  8.  
  9.  
  10. Session = sessionmaker(bind=engine)
  11. session = Session()
  12. Base = declarative_base()
  13.  
  14. class Usuario(Base):
  15.     __tablename__ = 'usuarios'
  16.     id = Column(Integer, primary_key=True)
  17.     name = Column(String(10))
  18.     active = Column(String(1))
  19.  
  20.     def __init__(self, id, name, active):
  21.         self.id = id
  22.         self.name = name
  23.         self.active = active
  24.  
  25. def CreateDb():
  26.     Base.metadata.create_all(engine)
  27.     for i in xrange(1, 50 + 1):
  28.         usr = Usuario(id=i, name="Usuario {0}".format(i), active='N')
  29.         session.add(usr)
  30.     try:
  31.         session.commit()
  32.     except IntegrityError:
  33.         pass
  34.  
  35. if __name__ == '__main__':
  36.     CreateDb()

A lo que confirmo mi teoría no tenias ningún constructor.
  #7 (permalink)  
Antiguo 20/12/2012, 05:14
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: Duda for y concatenar para llenar datos en una tabla

Cita:
Iniciado por razpeitia Ver Mensaje
Después de jugar un poco en un script y dado que no presentaste la clase usuario me arme este pequeño script.


A lo que confirmo mi teoría no tenias ningún constructor.
Hola, disculpa, no me di cuenta que no publiqué la clase usuario.

Yo la tenía así:

Código:
class Usuario(Base):
    __tablename__ = 'usuarios'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    active = Column(String(1))
  

    def __init__(self, name, active):
        self.name = name
        self.active = active
creo que lo que me faltaba era incluir ID en def __init__(self, name, active): !!!!

Tu script funciona perfecto!

Realmente muchas gracias por tu tiempo, me ayuda mucho para no quedar trancado en alguna parte y espero que le sirva a otros compañeros o internautas.


Etiquetas: concatenar, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:30.