· 2 years ago · Jul 11, 2023, 11:50 PM
1#!/usr/b#in/env python
2# -*- coding: utf-8 -*-
3#
4'''
5SQL lenguaje de consultas estructuras
6paradigma declarativo
7
8crear una base de datos llamada prueba:
9CREATE DATABASE estacionMetereologica;
10
11quiero ver todos los registros de una tabla Clima_DIA
12SELECT * FROM Clima_DIA
13
14motor de base de datos:
15MySQL, MariaDB, PostgreSQL, SQLite --> soft libre
16SQL Server, Oracle --> soft propio
17
18DB-API: API estandar de Python
19
20MySQL: mysql-connector-python, PyMySQL, MySQLdb
21PostgreSQL psycopg, pg8000
22SQLite: sqlite3 (ya viene instalada)
23SQL Server: pymssql, pyodbc
24Oracle: cx_Oracle
25"""
26# el mismo ejemplo para MYSQL
27# previamente instalar python -m pip install pymysql
28
29"""
30import pymysql
31
32# se conecta a la base
33conn = pymysql.connect(
34 host='localhost',
35 user='usuario',
36 passwd='password',
37 db='mi_base.db')
38
39# para hacer una consulta SDL necesito un cursor
40cursor = conn.cursor()
41
42# puedo ejecutar una consulta SQL: crear una tabla
43cursor.execute("CREATE TABLE IF NOT EXISTS personas(nombre VARCHAR(45), edad INT)")
44
45# como modifique la base debo "guardar los datos"
46conn.commit()
47
48# creo una tupla de datos
49datos = (
50 ("Juan",30),
51 ("Luis",11),
52 ("Vicky",25),
53)
54
55for nombre, edad in datos:
56 cursor.execute("INSERT INTO personas VALUES(%s,%s?)",(nombre,edad))
57
58conn.commit()
59
60# quiero imprimir
61cursor.execute("SELECT * FROM personas")
62personas = cursor.fetchall()
63print(personas)
64
65# cierro la conexion
66conn.close()
67'''
68
69# SQL Injection
70# >> Ingrese un nombre: Alejandro',22); DELETE FROM personas; --
71# >> Ingrese la edad: 30
72# INSERT INTO personas VALUES('Alejandro',22); DELETE FROM personas; --,30)
73
74
75import sqlite3
76
77conn = sqlite3.connect("mi_base.sqlite")
78
79cursor = conn.cursor()
80
81nombre = input("Ingrese un nombre: ")
82edad = int(input("Ingrese la edad: "))
83
84# condición correcta (resiste SQL Injection)
85# cursor.execute("INSERT INTO personas VALUES(?,?)",(nombre,edad))
86
87# condición peligrosa: si están habilitados los warnings resiste, si no, NO
88# lanza
89# sqlite3.Warning: You can only execute one statement at a time.
90# no da error, dice que solo ejecuta una instrucción a la vez
91# cursor.execute(f"INSERT INTO personas VALUES('{nombre}',{edad})")
92
93# condicion LETAL: borra la tabla
94cursor.executescript(f"INSERT INTO personas VALUES('{nombre}',{edad})")
95
96conn.commit()
97conn.close()
98