Python基础_数据库
1.Python操作MySQL
【1】pymysql模块
安装:
pip install pymysql基本语法
importpymysql# 连接到MySQL数据库conn=pymysql.connect(host='localhost',user='your_username',password='your_password',database='your_database')# 创建游标对象cursor=conn.cursor()# 执行SQL查询query="SELECT * FROM your_table"cursor.execute(query)# 获取查询结果result=cursor.fetchall()forrowinresult:print(row)# 关闭游标和数据库连接cursor.close()conn.close()在上述示例中,首先使用pymysql.connect()函数连接到MySQL数据库。您需要提供数据库的连接参数,如主机名、用户名、密码和数据库名称。
然后,使用连接对象的cursor()方法创建一个游标对象。游标用于执行SQL查询并获取结果。
执行SQL查询时,可以使用游标对象的execute()方法传递SQL查询语句。在示例中,我们执行了一个简单的SELECT语句来获取表中的所有数据。
接下来,使用游标对象的fetchall()方法获取查询结果。fetchall()方法返回一个包含所有行的列表,每行又是一个元组。
最后,使用cursor.close()关闭游标对象,使用conn.close()关闭数据库连接。
请注意,在实际使用中,可能需要根据具体情况进行错误处理、事务处理和参数化查询等操作,以确保代码的正确性和安全性。
案例:创建user表,插入用户记录:
importpymysqldefcreate_users_table():conn=pymysql.connect(host='localhost',user='root',password='yuan0316',database='db_day02')cursor=conn.cursor()# 创建表的 SQL 语句create_table_query=''' CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL ) '''# 执行创建表的 SQL 语句cursor.execute(create_table_query)cursor.close()conn.close()definsert_user(username,password):conn=pymysql.connect(host='localhost',user='root',password='yuan0316',database='db_day02')cursor=conn.cursor()# 插入记录的 SQL 语句insert_query=f"INSERT INTO users (username, password) VALUES ('{username}', '{password}')"# 执行插入记录的 SQL 语句cursor.execute(insert_query)conn.commit()cursor.close()conn.close()# 调用创建表函数create_users_table()# 用户输入作为参数传递给插入函数username=input("请输入用户名:")password=input("请输入密码:")# 调用插入函数insert_user(username,password)【2】SQL注入
SQL注入是一种常见的安全漏洞,它发生在应用程序未正确验证和处理用户输入数据时。攻击者可以通过在输入中插入恶意的SQL代码,利用这个漏洞来执行未经授权的数据库操作。
下面是一个简单的示例,展示了一个存在SQL注入漏洞的代码:
importpymysqldeflogin(username,password):conn=pymysql.connect(host='localhost',user='root',password='yuan0316',database='db_day02')cursor=conn.cursor()# 构造SQL查询语句query=f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"print("query:",query)# 执行SQL查询cursor.execute(query)# 获取查询结果result=cursor.fetchall()cursor.close()conn.close()iflen(result)>0:print("登录成功")else:print("登录失败")# 用户输入作为参数传递给登录函数username=input("请输入用户名:")password=input("请输入密码:")login(username,password)在上述示例中,我们定义了一个login函数,该函数接收用户名和密码作为参数。在函数内部,我们使用pymysql库连接到MySQL数据库,并构造了一个包含用户名和密码的SQL查询语句。
然而,代码中存在SQL注入漏洞。如果用户输入恶意的数据,例如在用户名输入框中输入
' or 1=1;--,那么构造的查询语句将变为:
SELECT*FROM users WHERE username=''or1=1;--' AND password = '111'这将导致查询条件始终为真,绕过了实际的身份验证过程,从而允许攻击者以任意用户登录。
要修复SQL注入漏洞,可以使用参数化查询或输入验证来过滤和转义用户输入数据,确保它们不会被当作SQL代码执行。以下是修复SQL注入漏洞的示例代码:
# 使用参数化查询构造SQL语句query="SELECT * FROM users WHERE username = %s AND password = %s"params=(username,password)# 执行SQL查询cursor.execute(query,params)在修复后的代码中,我们使用了参数化查询的方式来构造SQL语句。将用户输入作为参数传递给execute()方法,而不是直接将它们插入到SQL查询语句中。这样可以确保用户输入的数据被正确地转义和处理,防止SQL注入攻击的发生。
