Este código está asociado a una base de datos en Mysql que previamente está creada en mi ordenador el campo ID de la base se basa en INT mientras que el resto de campos se corresponden con VARCHAR 100. En este programa la idea es la siguiente:
1. Se tienen que crear 10 registros en la base de datos directamente sin introducirlos a mano y creo que eso ya está.
2. El programa tiene que permitir introducir datos por pantalla y teclado: Creo que eso lo tengo, pero tengo un problema con el ID. Necesito que siga la numeración de los que ya están introducidos, es decir si en los que ya he metido previamente hemos terminado en el ID 10, el siguiente que metamos por teclado será el 11, el siguiente el 12 ¿Cómo puedo resolver esto con Python? Otra de las peculiaridades que tiene la introducción por teclado sería evitar dejar uno de los campos en blanco...siempre tienen que estar todos rellenos. Enviando un aviso al usuario de que no se efectuará el insert.
3. Necesito crear un bucle en el que te deje meter varios registros, pero que llegado a un punto te deje salir de él y cerrar el programa.
4. Final print una tabla de datos.
Un saludo y dejo el código que he escrito.
Código:
#!/usr/python
# -*- coding: utf-8 -*-
#Queda hacer por hacer:
#ID
#bucle para introducir varios registros tipo basta
#Si se introduce un valor en blanco para cualquier campo
#no se efectuará el insert y se enviará al usuario un aviso advirtiendo que no se ha hecho
import MySQLdb
Conexion = MySQLdb.connect(host='localhost', user='conan',passwd='crom', db='DBdeConan') #Conexion con la base de datos
micursor = Conexion.cursor() #Cursor creado
#Insertando los 10 registros que pide el ejercicio
#Registro 1
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (1, \"Ejercito de Zombies\",\"Muertos Vivientes\",\"Desmembramiento a espada\");"
micursor.execute(query)
#Registro 2
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (2, \"Hombre lobo\",\"Licantropo\",\"Bala de plata\");"
micursor.execute(query)
#Registro 3
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (3, \"Vampiro feo\",\"Muertos Vivientes\",\"Estaca de madera\");"
micursor.execute(query)
#Registro 4
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (4, \"Gran Zombie\",\"Muertos Vivientes\",\"Balazo en cabeza\");"
micursor.execute(query)
#Registro 5
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (5, \"Espiritu\",\"Muertos\",\"Reflejo espejo\");"
micursor.execute(query)
#Registro 6
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (6, \"Dracula\",\"Muertos Vivientes\",\"Estaca de madera\");"
micursor.execute(query)
#Registro 7
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (7, \"Vampiro\",\"Muertos Vivientes\",\"Estaca de madera\");"
micursor.execute(query)
#Registro 8
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (8, \"Crinos\",\"Licantropo\",\"Bala de plata\");"
micursor.execute(query)
#Registro 9
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (9, \"Hispo\",\"Licantropo\",\"Bala de plata\");"
micursor.execute(query)
#Registro 10
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (10, \"Lobo\",\"Animales\",\"Espada\");"
micursor.execute(query)
Conexion.commit()
#Insertar registro de forma manual
Nombre= raw_input ("Ingrese el nombre de la victima:")
Profesion= raw_input ("Ingrese la profesion de la victima:")
Muerte= raw_input ("Ingrese la causa de la muerte:")
query = "INSERT INTO Victimas (id, Nombre, Profesion, Muerte)\
VALUES('%s','%s','%s','%s')" % \
(id, Nombre, Profesion, Muerte)
micursor.execute(query)
Conexion.commit() #Hacer efectiva la escritura de datos
Hola. Con respecto al campo ID, deberías dejar que MySQL maneje eso créandolo como un campo AUTOINCREMENT. Luego no es necesario incluirlo en la consulta:
Código:
query= "INSERT INTO Victimas (Nombre,Profesion,Muerte) VALUES (\"Ejercito de Zombies\",\"Muertos Vivientes\",\"Desmembramiento a espada\");"
Por otro lado, puedes usar una función como la siguiente para solicitar al usuario que ingrese un dato necesariamente:
Código:
def require_input(prompt):
ret = raw_input(prompt)
if not ret:
require_input(prompt)
return ret
Luego:
Código:
Nombre= require_input("Ingrese el nombre de la victima:")
Por último, para permitir al usuario ingresar varios registros deberías crear un bucle while y, luego de cada carga, preguntar si se quiere continuar con la siguiente o bien terminar el programa. Nuevamente, usando require_input(), un bucle, un condicional if y un break ya lo tendrías funcionando.
Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!
Muchas gracias por tus indicaciones. Creo que ya lo tengo...pero hay unas cosas que no entiendo.
1. Creo que solucioné lo del Id desde python, se que a través de mysql sería mucho más fácil pero no me dejan usarlo entonces me tengo que romper la cabeza para hacerlo desde python.
2. No entiendo porqué no me hace el INSERT y al final no veo los registros introducidos en la pantalla...
3. Necesitaría crear una especie de tabla para que al final de todo se imprimiesen todos los registros en la pantalla incluidos los introducidos a mano que actualmente no me aparecen.
Un saludo.
P.D.ejo el código.
Código:
#!/usr/python
# -*- coding: utf-8 -*-
#Queda hacer por hacer:
#ID
#bucle para introducir varios registros tipo basta
#Si se introduce un valor en blanco para cualquier campo
#no se efectuará el insert y se enviará al usuario un aviso advirtiendo que no se ha hecho
import MySQLdb
Conexion = MySQLdb.connect(host='localhost', user='conan',passwd='crom', db='DBdeConan') #Conexion con la base de datos
micursor = Conexion.cursor() #Cursor creado
#Insertando los 10 registros que pide el ejercicio
#Registro 1
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (1, \"Ejercito de Zombies\",\"Muertos Vivientes\",\"Desmembramiento a espada\");"
micursor.execute(query)
#Registro 2
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (2, \"Hombre lobo\",\"Licantropo\",\"Bala de plata\");"
micursor.execute(query)
#Registro 3
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (3, \"Vampiro feo\",\"Muertos Vivientes\",\"Estaca de madera\");"
micursor.execute(query)
#Registro 4
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (4, \"Gran Zombie\",\"Muertos Vivientes\",\"Balazo en cabeza\");"
micursor.execute(query)
#Registro 5
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (5, \"Espiritu\",\"Muertos\",\"Reflejo espejo\");"
micursor.execute(query)
#Registro 6
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (6, \"Dracula\",\"Muertos Vivientes\",\"Estaca de madera\");"
micursor.execute(query)
#Registro 7
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (7, \"Vampiro\",\"Muertos Vivientes\",\"Estaca de madera\");"
micursor.execute(query)
#Registro 8
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (8, \"Crinos\",\"Licantropo\",\"Bala de plata\");"
micursor.execute(query)
#Registro 9
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (9, \"Hispo\",\"Licantropo\",\"Bala de plata\");"
micursor.execute(query)
#Registro 10
query= "INSERT INTO Victimas (id,Nombre,Profesion,Muerte) VALUES (10, \"Lobo\",\"Animales\",\"Espada\");"
micursor.execute(query)
Conexion.commit()
#Generando un nuevo ID
def generarNuevoId():
"""
Funcion que genera un nuevo id de forma aleatoria
"""
lista = [1,2,3,4,5,6,7,8,9,10] #id ya creadas
nuevoid = generarNuevoId()
while nuevoid in lista:
nuevoid = generarNuevoId()
lista.append(nuevoid)
id=[-1]
#Insertar registro de forma manual (VER Modulo Ingreso)
def require_input(prompt):
ret = raw_input(prompt)
if not ret:
require_input(prompt)
return ret
Nombre= require_input("Ingrese el nombre de la victima:")
Profesion= require_input ("Ingrese la profesion de la victima:")
Muerte= require_input("Ingrese la causa de la muerte:")
while True:
opcion = raw_input('(Para salir pulse S) (Para conitnuar pulse C)')
if opcion.upper() == 'S':
query= "SELECT * FROM Victimas";
micursor.execute(query)
registros= micursor.fetchall()
print registros
break
elif opcion.upper ()=='C':
Nombre= require_input("Ingrese el nombre de la victima:")
Profesion= require_input ("Ingrese la profesion de la victima:")
Muerte= require_input("Ingrese la causa de la muerte:")
else:
try:
opcion = raw_input('(Para salir pulse S) (Para conitnuar pulse C)')
except:
print "Entrada no valida"
query = "INSERT INTO Victimas (id, Nombre, Profesion, Muerte)\
VALUES('%s','%s','%s','%s');" \
micursor.execute(query) #No entiendo porqué no funciona
Conexion.commit()
#Final base y borrado
query= "DELETE FROM Victimas";
micursor.execute(query)
Conexion.commit()
15-12-2017, 03:41 PM (Última modificación: 15-12-2017, 03:41 PM por Francisco.)
Hola. Ya casi lo tienes con el bucle, pero debería quedar así:
Código:
while True:
opcion = raw_input('(Para salir pulse S) (Para conitnuar pulse C)')
if opcion.upper() == 'S':
query= "SELECT * FROM Victimas";
micursor.execute(query)
registros= micursor.fetchall()
print registros
break
elif opcion.upper ()=='C':
Nombre= require_input("Ingrese el nombre de la victima:")
Profesion= require_input ("Ingrese la profesion de la victima:")
Muerte= require_input("Ingrese la causa de la muerte:")
# Aquí primero deberías generar un ID y guardarlo en id_generado.
query = "INSERT INTO Victimas (id, Nombre, Profesion, Muerte)\n VALUES('%s','%s','%s','%s');" \n micursor.execute(query, (id_generado, Nombre, Profesion, Muerte))
Conexion.commit()
print "El registro ha sido ingresado."
Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!
16-12-2017, 06:33 PM (Última modificación: 16-12-2017, 06:34 PM por Francisco.)
Bien, habría que tener una variable last_id que contenga el último ID generado. Si el contenido debe mantenerse, deberías almacenarla en disco al finalizar el programa y cargarla al iniciarlo. Algo más o menos así:
Código:
# Al iniciar.
try:
f = open("lastid.txt")
except IOError:
last_id = 0
else:
last_id = int(f.read())
f.close()
# last_id debería aumentar luego de cada INSERT.
# Al finalizar.
f = open("lastid.txt", "w")
f.write(str(last_id))
f.close()
Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!
Ok, en mi caso la última ID generada sería el número 10 es decir el número 11 y a partir de este sería dentro de python. ¿Donde quedaría intsertado en mi código? ¿Por qué un archivo txt para el id? Por último... No consigo que funcione el cursor del bucle while.
16-12-2017, 07:13 PM (Última modificación: 16-12-2017, 07:14 PM por Francisco.)
El objetivo del archivo es almacenar el ID cuando el programa se cierra. De lo contrario siempre se empezaría desde el mismo ID. A menos que sea eso lo que quieras... en cuyo caso simplemente creas la variable y la vas aumentando luego de cada inserción.
¿Qué error obtienes con el cursor? Según creo en el siguiente código no son necesarias las comillas, tal vez eso esté generando algún error. Debería quedar así:
def require_input(prompt):
ret = raw_input(prompt)
if not ret:
require_input(prompt)
return ret
Nombre= require_input("Ingrese el nombre de la victima:")
Profesion= require_input ("Ingrese la profesion de la victima:")
Muerte= require_input("Ingrese la causa de la muerte:")
while True: #Bucle para dejar que el usuario ingrese más personajes
opcion = raw_input('(Para salir pulse S) (Para continuar pulse C)')
if opcion.upper() == 'S':
query= "SELECT * FROM Victimas";
micursor.execute(query)
registros= micursor.fetchall()
print registros
break
elif opcion.upper ()=='C':
Nombre= require_input("Ingrese el nombre de la victima:")
Profesion= require_input ("Ingrese la profesion de la victima:")
Muerte= require_input("Ingrese la causa de la muerte:")
id_generado=11
# Aquí primero deberías generar un ID y guardarlo en id_generado.
query = "INSERT INTO Victimas (id, Nombre, Profesion, Muerte)\
VALUES(%s, %s, %s, %s);"
micursor.execute(query, (id_generado, Nombre, Profesion, Muerte))
print "El registro ha sido ingresado."
f = open("lastid.txt", "w")
f.write(str(last_id))
f.close()
#Final base y borrado
query= "DELETE FROM Victimas";
micursor.execute(query)
Conexion.commit()
Hola. El problema simplemente es que tienes un espacio adinicional antes de esa línea ─de ahí el error de indentación─. Recuerda que Python es muy estrcito en este sentido, ya que los espacios o tabulaciones son la única forma de delimitar los bloques de código.
Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!