Python + pymysql 之 MySQL 查询操作

在MySQL中构建一个测试表,如下:

查询单条数据

# -*- coding: UTF-8 -*-
import pymysql


def mysql_query():
    """
    MySQL查询
    :return:
    """
    # 打开数据库连接
    db = pymysql.connect(host="127.0.0.1",
                         user="root",
                         password="testtest",
                         database="testdb")
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
    # SQL语句
    sql = """
    select * from student_info;
    """
    # 使用 execute()  方法执行 SQL 查询
    cursor.execute(sql)
    # 获取第一条结果
    student = cursor.fetchone()
    print(type(student))
    print(student)
    # 关闭数据库连接
    db.close()
    # 返回查询结果
    return student


if __name__ == '__main__':
    mysql_query()


 打印输出结果:

<class 'tuple'>
(1, '张三', '2233445566', 18)

从中可以看出,默认情况下,查询结果返回的是元组tuple形式

返回元组会有一个问题,当你只查询一个属性字段时,返回的结果会是有逗号的元组

例如:sql改变一下

    sql = """
    select name from student_info where id =2;
    """

此时,打印输出结果:

<class 'tuple'>
('李四',)

此时,建议return前,简单处理一下,我们只取返回结果元组的第一个元素

student = cursor.fetchone()[0]

此时,打印输出结果:

<class 'str'>
李四

这样一来,函数的输出结果就可以直接使用啦

那么,还有没有其他返回形式呢,答案是有的

还可以返回字典形式,在代码中创建游标时,传入参数,指定返回字典形式

cursor = db.cursor(pymysql.cursors.DictCursor)

此时,打印输出结果:

<class 'dict'>
{'name': '李四'}

查询全部数据

把其中的

student = cursor.fetchone()

替换为

students = cursor.fetchall()

此时返回全部数据,默认为元组形式

((1, '张三', '2233445566', 18), (2, '李四', '12341234', 19), (3, '王五', '11112222', 20))

同样需要注意,如果只是查询一个属性字段的话,返回的是元组形式

(('张三',), ('李四',), ('王五',))

此时,可以用一个循环,来提取属性内容到

names = [student[0] for student in students]

此时,打印names结果为:

['张三', '李四', '王五']

传参查询

例如:根据学生id查询学生姓名

传参的方式:

# SQL语句
sql = """
select name from student_info where id = %s;
"""
# 使用 execute()  方法执行 SQL 查询
cursor.execute(sql, [id])

注意:此处的占位符是%s,无论是字符串、数字或者其他类型,都是这个占位符。 %s不能加引号。

上代码

def get_name_by_id(id):
    """
    根据学生id查询学生姓名
    :param id:
    :return:
    """
    # 打开数据库连接
    db = pymysql.connect(host="127.0.0.1",
                         user="root",
                         password="testtest",
                         database="testdb")
    # 使用 cursor() 方法创建一个游标对象 cursor 以元组形式返回
    cursor = db.cursor()
    # SQL语句
    sql = """
    select name from student_info where id = %s;
    """
    # 使用 execute()  方法执行 SQL 查询
    cursor.execute(sql, [id])
    # 获取第一条结果
    name = cursor.fetchone()[0]
    # 关闭数据库连接
    db.close()
    # 返回查询结果
    return name


if __name__ == '__main__':
    id = 3
    name = get_name_by_id(id)
    print(name)

返回打印结果:

王五

为什么不用拼接字符串的方式来组装sql语句呢?

为了防注入,建议大家养成习惯

拿一个典型的登录注入来举例:

    username = 'zhangsan'
    password = '123456'
    sql = "SELECT user_id FROM users WHERE username = '{}' AND password = '{}';".format(username, password)

看起来也没毛病,但是如果此时,username传入的是如下内容:

username = 'zhangsan OR 1 = 1 -- a'

sql就会变成这个样子了:

SELECT user_id FROM users WHERE username = 'zhangsan OR 1 = 1 -- a' AND password = '123456';

美化一下SQL

SELECT
	user_id 
FROM
	users 
WHERE
	username = 'zhangsan' 
	OR 1 = 1 -- a AND password = 'abc';

这段sql的效果是无论输入什么密码,都会返回登录成功。

改成使用pymysql列表方式传参就不怕注入啦

def get_user_id(username, password):
    # 打开数据库连接
    db = pymysql.connect(host="127.0.0.1",
                         user="root",
                         password="testtest",
                         database="testdb")
    # 使用 cursor() 方法创建一个游标对象 cursor 以元组形式返回
    cursor = db.cursor()
    # SQL语句
    sql = """
    SELECT user_id FROM users WHERE username = %s AND password = %s;
    """
    # 使用 execute()  方法执行 SQL 查询
    cursor.execute(sql, [username, password])
    # 获取第一条结果
    user_id = cursor.fetchone()
    # 关闭数据库连接
    db.close()
    # 返回查询结果
    return user_id


if __name__ == '__main__':
    username = 'zhangsan OR 1 = 1 -- a'
    password = 'abc'
    user_id = get_user_id(username, password)
    print(bool(user_id))

返回打印结果为:

False

Python可以通过pymysql模块来连接MySQL数据库,具体步骤如下: 1. 安装pymysql模块 可以通过以下命令来安装pymysql模块: ``` pip install pymysql ``` 2. 连接MySQL数据库 可以使用以下代码来连接MySQL数据库: ``` import pymysql # 打开数据库连接 db = pymysql.connect("host", "username", "password", "database") # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() # 使用 execute() 方法执行 SQL 查询 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法获取单条数据. data = cursor.fetchone() print("Database version : %s " % data) # 关闭数据库连接 db.close() ``` 其中,host为MySQL服务器地址,username为MySQL登录用户名,password为MySQL登录密码,database为要连接的数据库名称。以上代码连接成功后,输出数据库版本号。 3. 执行SQL语句 可以使用execute()方法来执行SQL语句,例如: ``` import pymysql # 打开数据库连接 db = pymysql.connect("host", "username", "password", "database") # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() # 执行SQL语句 sql = "SELECT * FROM books" cursor.execute(sql) # 获取所有数据 results = cursor.fetchall() for row in results: id = row[0] title = row[1] author = row[2] price = row[3] print("id=%d,title=%s,author=%s,price=%f" % (id, title, author, price)) # 关闭数据库连接 db.close() ``` 以上代码执行了一个查询语句查询books表中的所有数据,并输出到控制台。 4. 插入数据 可以使用execute()方法来执行插入数据的SQL语句,例如: ``` import pymysql # 打开数据库连接 db = pymysql.connect("host", "username", "password", "database") # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() # 插入数据 sql = "INSERT INTO books (title, author, price) VALUES ('Python编程', '张三', 29.99)" cursor.execute(sql) # 提交事务 db.commit() # 关闭数据库连接 db.close() ``` 以上代码向books表中插入了一条数据,提交事务后关闭数据库连接。 以上是使用Python连接MySQL数据库的简单示例,可以根据实际需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值