Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Alguien que "PILOTE" Python
#1
Estoy haciendo una pruebas de acceso mediante python a un MySql y no logro insertar nuevos registros en la base de datos con este codigo, prodria algun crack en pyton decirme en que esta mal el codigo? no da ningun error incluso sale impreso que los datos se agregaron correctamente.

#!/usr/bin/Python

import MySQLdb

def agregar(server,user,passwd,bd):
db = MySQLdb.connect(server,user,passwd,bd)
cursor = db.cursor()
name = raw_input('[+]Nombre: ')
fono = raw_input('[+]Telefono: ')
cursor.execute("insert into contactos (nombre,telefono) values ('%s','%s')"%(name,fono))
print 'Datos agregados correctamente...'
cursor.fetchall()
cursor.close()

server = "localhost"
user = "root"
passwd = "passwd1254"
bd = "contactos"

agregar(server,user,passwd,bd)
Citar
#2
Yo me temo que de Python poco o nada, pero algo útil cuando estas trabajando con MySQL (O cualquier otra BBDD, vaya) es mostrar la query "tal como queda" para ver si la has construido bien, en este caso, personalmente, te diría que probases a cambiar

cursor.execute("insert into contactos (nombre,telefono) values ('%s','%s')"%(name,fono))

por alguna función que te construya esa misma query en un string (Si fuese C, por ejemplo, con strcat y similares) y muestres ese string además de usarlo en "cursor.execute(string_creada)". Así, como te digo, descartas que el problema está en otro sitio que no sea la query.

Fíjate que el hecho de que imprima que los datos se agregaron correctamente es irrelevante: tal cual lo has escrito, si falla la query, tu no lo sabes e imprimes el mensaje de ok (Probablemente puedes chequear lo que devuelve "cursor.execute" para ver si te dice que la query se ejecutó correctamente o no...)

Siento no ser de más ayuda, pero como te digo, puede que el fallo no esté en el código de Python en sí, si no en la query...


EDIT: Tras una búsqueda rápida...

http://www.tutorialspoint.com/python/pyt...access.htm

fíjate que usa db.commit() justo despues del insert. Además, como puedes ver, en ese ejemplo si usan el control de errores:

Código:
# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Como ves, construye la query en un string, aunque en este caso no lo muestra, pero para depurar suele ser cómodo Guiño
Citar
#3
He checkeado las variables name y fono y estan ok, poniendo un prin al final de la funcion y son correctas, pienso que el error estas en la linea que comentas, de alguna manera los valores name y fono no se estan asignado a value. pero no tengo ni idea de por que!!!
Citar
#4
Mira el edit, la página tiene buena pinta Guiño
Citar
#5
Lo del control de errores (el bloque try-except) siempre es una buena idea... Sonrisa
Citar
#6
¿Cómo quedó la cosa, jualyso? ¿Has podido solucionarlo? Si has podido, por curiosidad, ¿Era el tema del commit, la query estaba mal formada, otra cosa...?
Citar
#7
Thorontir escribió:¿Cómo quedó la cosa, jualyso? ¿Has podido solucionarlo? Si has podido, por curiosidad, ¿Era el tema del commit, la query estaba mal formada, otra cosa...?

Sí, a mí también me interesa saber si era eso... Sonrisa
Citar
#8
Pues no he podido ponerme a fondo por falta de tiempo. El codigo no es mio, lo pille por la web y es una pequeña agenda que guarda los datos en un MySql. Realmente queria reutilizar el código para otra aplicación que quería hacer, pero al probarlo comprobé que a mi no me funcionaba la función agregar(), sin embargo, si metemos manualmente varios usuarios (yo lo hago directamente desde phphmyadmin) todas las demás funciones funcionan correctamente las de mostrar todos los contactos modificar y borrar. He preguntado en el blog del que publica el código pero es una entrada antigua y no creo que conteste. Pego todo el código y pongo el link del blog.

Base de datos contactos con tabla contactos con tres campos nombre, telefono y mail. todas varchar de longitud 50

Código:
#!/usr/bin/Python

###########################
#AGENDA EN PYTHON V 1.5   #
#BY [Z]tuX                #
#http://ztux.blogspot.com/#
###########################

import MySQLdb, os

def agregar(server,user,passwd,bd):
    db = MySQLdb.connect(server,user,passwd,bd)
    cursor = db.cursor()
    name = raw_input('[+]Nombre: ')
    telefono = raw_input('[+]Telefono: ')
    mail= raw_input('[+]E-Mail: ')
    cursor.execute("insert into contactos (nombre,telefono,mail) values ('%s','%s','%s')"%(name,telefono,mail))
    print 'Datos agregados correctamente...'
    cursor.fetchall()
    cursor.close()
    raw_input("> Press Enter...")
    run()
def ver (server,user,passwd,bd):
    try:
        db = MySQLdb.connect(server,user,passwd,bd)
        ztux = db.cursor()
        ztux.execute("select * from %s "%(bd))
        a = ztux.fetchall()
        for i in a: #Se crea una lista en la variable i
           if i=='':
               print "No hay contactos..."
           else:
               print '[+]Nombre:',i[0],'\n[+]Telefono:',i[1],'\n[+]E-Mail:',i[2],"\n----------"  #Mostramos La lista
        ztux.close()
        raw_input("> Press Enter...")
        run()
    except:
        print '[*]Error al conectar a la base de Datos...\n'
        run()
    
def buscar(server,user,passwd,bd):
    try:
        db = MySQLdb.connect(server,user,passwd,bd)
        buscar = raw_input('[+]Nombre del contacto: ')
        ztux = db.cursor()
        ztux.execute("select * from %s where nombre='%s'"%(bd,buscar))
        a = ztux.fetchall()
        for i in a:
            print '[+]Nombre:',i[0],'\n[+]Telefono:',i[1],'\n[+]E-Mail:',i[2]
        ztux.close()
        raw_input("> Press Enter...")
        run()
    except:
        print '[*]Error al conectar a la base de Datos...\n'
        run()
        
def editar(server,user,passwd,bd):
    try:
        db = MySQLdb.connect(server,user,passwd,bd)
        print '[1]Nombre\n[2]Telefono\n[3]E-mail\n[+]Regresar'
        opc =raw_input('Que desas editar: ')
        if opc=='1':
            editar = raw_input('[+]Nombre del contacto a editar: ')
            cambiar = raw_input('[+]Escribe el nuevo nombre del contacto: ')
            ztux = db.cursor()
            ztux.execute("update %s set nombre='%s' where nombre='%s'"%(bd,cambiar,editar))
            ztux.close()
            print 'Contacto Actualizado...'
            raw_input("> Press Enter...")
            run()
        elif opc=='2':
            editar = raw_input('[+]Nombre del contacto a editar: ')
            cambiar = raw_input('[+]Escribe el nuevo numero del contacto: ')
            ztux = db.cursor()
            ztux.execute("update %s set telefono='%s' where nombre='%s'"%(bd,cambiar,editar))
            ztux.close()
            print 'Contacto Actualizado...'
            raw_input("> Press Enter...")
            run()
        elif opc=='3':
            editar = raw_input('[+]Nombre del contacto a editar: ')
            cambiar = raw_input('[+]Escribe el nuevo e-mail del contacto: ')
            ztux = db.cursor()
            ztux.execute("update %s set mail='%s' where nombre='%s'"%(bd,cambiar,editar))
            ztux.close()
            print 'Contacto Actualizado...'
            raw_input("> Press Enter...")
            run()
        elif opc=='+':
            run()
        else:
            print 'Opcion Incorrecta...'
            run()
            
    except:
        print '[*]Error al conectar a la base de Datos...\n'
        raw_input("> Press Enter...")
        run()

def borrar(server,user,passwd,bd):
    try:
        db = MySQLdb.connect(server,user,passwd,bd)
        borrar = raw_input('[+]Nombre del contacto: ')
        ztux = db.cursor()
        ztux.execute("delete from %s where nombre='%s'"%(bd,borrar))
        ztux.close()
        print '[+]Contacto borrado con exito...'
        raw_input("> Press Enter...")
        run()
    except:
        print '[*]Error al conectar a la base de Datos...\n'      
  
def run():
    os.system('clear') #Cambiar "clear" por "cls" si Usas Windows
    print '-------------------------'
    print '    Agenda by [Z]tuX     '
    print 'http://ztux.blogspot.com/'
    print '   ztux.ztux@gmail.com   '
    print '-------------------------'
    print '''[1] Agregar contacto
[2] Ver contactos  
[3] Buscar Contacto
[4] Editar Contacto
[5] Borrar contacto
[0] Salir          
''' #CONFIGURAR AQUI#
    server='localhost' #Servidor MySQL
    user='root'        #Usuario MySQL
    passwd='chucho'    #Passwd MySQL
    bd='contactos'     #Base de Datos
    #################
    opc = raw_input('> ')
    if opc =='1':
        agregar(server,user,passwd,bd)
    elif opc =='2':
        ver(server,user,passwd,bd)
    elif opc =='3':
        buscar(server,user,passwd,bd)
    elif opc=='4':
        editar(server,user,passwd,bd)
    elif opc=='5':
        borrar(server,user,passwd,bd)
    elif opc=='0':
        return 0
    else:
        print '[*]Opcion Incorrecta...'
        run()
run()


link del blog http://ztux.blogspot.com.es/2011/12/agen...l-v15.html
Citar
#9
Hola:

Solo pasaba por aqui, y python me llamo la atención. Yo de crack nada, pero algo he leido.

A la pregunta
Cita:" en que esta mal el codigo?
" diría que lo tiraras y cogieras otro XD refiriendome al ejemplo que has cogido.

No quiero parecer un capullo destrozando codigo ajeno, pero hay algunas cuantas malas practicas en ese peazo de texto. Puede parecer sencillo, pero es la madre del desastre... sin control de errores, faltan comprobaciones sangrantes (comprueba que sale bien el select, y no comprueba si funciono un insert O_0! ), código duplicado, mala definición de funciones, selects sin limites, no escapa consultas... en solo 148 lineas.... (Seguro que revienta a las 150... Lengua)
Úsalo si te vale para tu proyecto, o para practicar, pero no lo uses para algún proyecto nimiamente serio, y bajo ningún concepto para algo accesible por el público.

Y sobre el fallo en tu programa:
Primero haz caso de lo que han comentado aqui, usa bloques try:except para cosas como esta, y revisa las consultas que hagas.
En realidad yo haria una sola funcion que tocara la bd, y te quedas mas tranquilo....

Revisando la docu de la libreria que usa el ejemlo http://mysql-python.sourceforge.net/MySQ...attributes
veo que es bastante delicada jejeje. Si vas a usar solo una variable en la select, tienes que poner una coma en la tupla:

Código:
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

Lo que es un poco ridiculo y problematico....

Mi propuesta es:

Código:
#!/usr/bin/Python

import MySQLdb

# Configuracion de la base de datos
server = "localhost"
user = "root"
passwd = "passwd1254"
bd = "contactos"


def consulta_sql( query = None):
        assert(query != None)
        print "DEBUG:", "consulta:", query
        global server  # Uso globales, porque luego es mas
        global user  # facil convertirlas a configuracion
        global passwd  # con este metodo
        global bd
        db = MySQLdb.connect(server,user,passwd,bd)
        cursor = db.cursor()
        resultado = False  # flag de control de ejecucion
        try:
                resultado = cursor.execute(query)
                print "DEBUG", "Informacion de la ultima consulta:", cursor.info()
                db.commit()
        except:
                print "ERROR: ", "algo ha salido mal en la consulta"
                db.rollback()

        cursor.close()
        return resultado



def agregar(server,user,passwd,bd):
        name = raw_input('[+]Nombre: ')
        fono = raw_input('[+]Telefono: ')
        if consulta_sql("insert into contactos (nombre,telefono) values ('%s','%s')"%(name,fono)):
                print 'Datos agregados correctamente...'
        consulta_sql("select * from contactos limit = 100" )


agregar()


Tambien tiene sus defectos, pero algunos son decisiones tomadas para mantenerlo sencillo.
Esta sin probar, asi que es posible que tenga algun casque. Mi intencion es mas bien darte pistas para mejorar ese codigo y encontrar el problema.

Espero que sirva de algo.
Citar
#10
Gracias por la respuesta wakaru, pero tampoco funciona tu solución. La probé independientemente y no va, ya no se si es problema de mi IDE compilador o version de python pero no funciona. Gracias de todos modos, seguire buscando y probando.

error que da: parece que no asigna los valores de las variables a la funcion agregar.

File "agregarspain.py", line 44, in <module>
agregar()
TypeError: agregar() takes exactly 4 arguments (0 given)
Citar
#11
la verdad es que lo escribí sin probarlo. solo queria darte una pista, no liarte mas je je.

quita los parámetros de la definición de la función, que ahí no pintan nada. tenía que haberlos quitado yo...

Sent from my Galaxy Nexus using Forum Fiend v1.0.1.
Citar
#12
por cierto, si quieres, podemos resolverlo rápidamente, o al menos intentarlo, por hangout.
si quieres, mandame un privado, cambiamos correos, y lo miramos en un momento, que seguro que es una pijada

Sent from my Galaxy Nexus using Forum Fiend v1.0.1.
Citar
#13
wakaru escribió:por cierto, si quieres, podemos resolverlo rápidamente, o al menos intentarlo, por hangout.
si quieres, mandame un privado, cambiamos correos, y lo miramos en un momento, que seguro que es una pijada

Sent from my Galaxy Nexus using Forum Fiend v1.0.1.

Desues de mirar muchos codigos y leer algo he dado con el problema, faltaba la siguiente linea de codigo
db.commit() si no se pone no se guardan los datos del insert pongo el codigo para el que le interese o pueda reutilizar el codigo.
Gracias a todos por el aporte y prometo mejorar el codigo poniendo un control de errores y demas Sonrisa Mola

Código:
#!/usr/bin/Python

###########################
#AGENDA EN PYTHON V 1.5   #
#BY [Z]tuX                #
#http://ztux.blogspot.com/#
###########################

import MySQLdb, os

def agregar(server,user,passwd,bd):
    db = MySQLdb.connect(server,user,passwd,bd)
    cursor = db.cursor()
    name = raw_input('[+]Nombre: ')
    telefono = raw_input('[+]Telefono: ')
    mail= raw_input('[+]E-Mail: ')
    cursor.execute("insert into contactos (nombre, telefono, mail) values ('%s','%s','%s')"%(name,telefono,mail));
    print 'Datos agregados correctamente...'
    cursor.fetchall()
    db.commit()
    cursor.close()
    raw_input("> Press Enter...")
    run()
def ver (server,user,passwd,bd):
    try:
        db = MySQLdb.connect(server,user,passwd,bd)
        ztux = db.cursor()
        ztux.execute("select * from %s "%(bd))
        a = ztux.fetchall()
        for i in a: #Se crea una lista en la variable i
           if i=='':
               print "No hay contactos..."
           else:
               print '[+]Nombre:',i[0],'\n[+]Telefono:',i[1],'\n[+]E-Mail:',i[2],"\n----------"  #Mostramos La lista
        ztux.close()
        raw_input("> Press Enter...")
        run()
    except:
        print '[*]Error al conectar a la base de Datos...\n'
        run()
    
def buscar(server,user,passwd,bd):
    try:
        db = MySQLdb.connect(server,user,passwd,bd)
        buscar = raw_input('[+]Nombre del contacto: ')
        ztux = db.cursor()
        ztux.execute("select * from %s where nombre='%s'"%(bd,buscar))
        a = ztux.fetchall()
        for i in a:
            print '[+]Nombre:',i[0],'\n[+]Telefono:',i[1],'\n[+]E-Mail:',i[2]
        ztux.close()
        raw_input("> Press Enter...")
        run()
    except:
        print '[*]Error al conectar a la base de Datos...\n'
        run()
        
def editar(server,user,passwd,bd):
    try:
        db = MySQLdb.connect(server,user,passwd,bd)
        print '[1]Nombre\n[2]Telefono\n[3]E-mail\n[+]Regresar'
        opc =raw_input('Que desas editar: ')
        if opc=='1':
            editar = raw_input('[+]Nombre del contacto a editar: ')
            cambiar = raw_input('[+]Escribe el nuevo nombre del contacto: ')
            ztux = db.cursor()
            ztux.execute("update %s set nombre='%s' where nombre='%s'"%(bd,cambiar,editar))
            ztux.close()
            print 'Contacto Actualizado...'
            raw_input("> Press Enter...")
            run()
        elif opc=='2':
            editar = raw_input('[+]Nombre del contacto a editar: ')
            cambiar = raw_input('[+]Escribe el nuevo numero del contacto: ')
            ztux = db.cursor()
            ztux.execute("update %s set telefono='%s' where nombre='%s'"%(bd,cambiar,editar))
            ztux.close()
            print 'Contacto Actualizado...'
            raw_input("> Press Enter...")
            run()
        elif opc=='3':
            editar = raw_input('[+]Nombre del contacto a editar: ')
            cambiar = raw_input('[+]Escribe el nuevo e-mail del contacto: ')
            ztux = db.cursor()
            ztux.execute("update %s set mail='%s' where nombre='%s'"%(bd,cambiar,editar))
            ztux.close()
            print 'Contacto Actualizado...'
            raw_input("> Press Enter...")
            run()
        elif opc=='+':
            run()
        else:
            print 'Opcion Incorrecta...'
            run()
            
    except:
        print '[*]Error al conectar a la base de Datos...\n'
        raw_input("> Press Enter...")
        run()

def borrar(server,user,passwd,bd):
    try:
        db = MySQLdb.connect(server,user,passwd,bd)
        borrar = raw_input('[+]Nombre del contacto: ')
        ztux = db.cursor()
        ztux.execute("delete from %s where nombre='%s'"%(bd,borrar))
        ztux.close()
        print '[+]Contacto borrado con exito...'
        raw_input("> Press Enter...")
        run()
    except:
        print '[*]Error al conectar a la base de Datos...\n'    

def run():
    os.system('clear') #Cambiar "clear" por "cls" si Usas Windows
    print '-------------------------'
    print '    Agenda by [Z]tuX     '
    print 'http://ztux.blogspot.com/'
    print '   ztux.ztux@gmail.com   '
    print '-------------------------'
    print '''[1] Agregar contacto
[2] Ver contactos  
[3] Buscar Contacto
[4] Editar Contacto
[5] Borrar contacto
[0] Salir          
''' #CONFIGURAR AQUI#
    server='localhost' #Servidor MySQL
    user='root'        #Usuario MySQL
    passwd='tupassword'    #Passwd MySQL
    bd='contactos'     #Base de Datos
    #################
    opc = raw_input('> ')
    if opc =='1':
        agregar(server,user,passwd,bd)
    elif opc =='2':
        ver(server,user,passwd,bd)
    elif opc =='3':
        buscar(server,user,passwd,bd)
    elif opc=='4':
        editar(server,user,passwd,bd)
    elif opc=='5':
        borrar(server,user,passwd,bd)
    elif opc=='0':
        return 0
    else:
        print '[*]Opcion Incorrecta...'
        run()
run()
Citar
#14
Thorontir escribió:Yo me temo que de Python poco o nada, pero algo útil cuando estas trabajando con MySQL (O cualquier otra BBDD, vaya) es mostrar la query "tal como queda" para ver si la has construido bien, en este caso, personalmente, te diría que probases a cambiar

cursor.execute("insert into contactos (nombre,telefono) values ('%s','%s')"%(name,fono))

por alguna función que te construya esa misma query en un string (Si fuese C, por ejemplo, con strcat y similares) y muestres ese string además de usarlo en "cursor.execute(string_creada)". Así, como te digo, descartas que el problema está en otro sitio que no sea la query.

Fíjate que el hecho de que imprima que los datos se agregaron correctamente es irrelevante: tal cual lo has escrito, si falla la query, tu no lo sabes e imprimes el mensaje de ok (Probablemente puedes chequear lo que devuelve "cursor.execute" para ver si te dice que la query se ejecutó correctamente o no...)

Siento no ser de más ayuda, pero como te digo, puede que el fallo no esté en el código de Python en sí, si no en la query...


EDIT: Tras una búsqueda rápida...


http://www.tutorialspoint.com/python/pyt...access.htm

fíjate que usa db.commit() justo despues del insert. Además, como puedes ver, en ese ejemplo si usan el control de errores:

Código:
# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Como ves, construye la query en un string, aunque en este caso no lo muestra, pero para depurar suele ser cómodo Guiño

No me fijé en el edit, no vi que comentabas lo del Commit() pero bueno por una o por otra ya está solucionado, gracias.
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
Pregunta Crear panel web para ejecutar scripts (bash/python) Electromecánico 5 505 08-05-2018, 08:38 PM
Último mensaje: Electromecánico
Pregunta Alguien con un Slimbook? Electromecánico 2 754 21-02-2017, 12:44 PM
Último mensaje: Electromecánico
  Por qué me sale del try? [PYTHON] Electromecánico 2 722 22-01-2017, 01:13 PM
Último mensaje: Electromecánico
  Alguien con conocimientos de openNI y kinect? biketrial981 7 1,437 04-08-2014, 04:42 PM
Último mensaje: Kvothe