Python学习笔记

Posted 阿远ay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习笔记相关的知识,希望对你有一定的参考价值。


一、pymysql的安装

pip3 install pymysql


二、pymysql的使用

1.导入 pymysql 包

import pymysql

2.创建连接对象

调用pymysql模块中的connect()函数来创建连接对象,代码如下:

conn=connect(参数列表)

  • 参数host:连接的mysql主机,如果本机是’localhost’
  • 参数port:连接的mysql主机的端口,默认是3306
  • 参数user:连接的用户名
  • 参数password:连接的密码
  • 参数database:数据库的名称
  • 参数charset:通信采用的编码方式,推荐使用utf8

连接对象操作说明:

关闭连接 conn.close()
提交数据 conn.commit()
撤销数据 conn.rollback()

3.获取游标对象

获取游标对象的目标就是要执行sql语句,完成对数据库的增、删、改、查操作。代码如下:

调用连接对象的cursor()方法获取游标对象
cur =conn.cursor()

游标操作说明:使用游标执行SQL语句: execute(operation [parameters ]) 执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete、select等语句
获取查询结果集中的一条数据:cur.fetchone()返回一个元组, 如 (1,‘张三’)
获取查询结果集中的所有数据: cur.fetchall()返回一个元组,如((1,‘张三’),(2,‘李四’))
关闭游标: cur.close(),表示和数据库操作完成这里是引用

4.pymysql完成数据的查询操作

# 1. 导包
import pymysql
if __name__ == '__main__':
    # 2. 创建连接对象
    # connect = Connection = Connect 本质上是一个函数,使用这三个里面的任何一个函数都可以创建一个连接对象
    # 1. host : 服务器的主机地址
    # 2. port: mysql数据库的端口号
    # 3. user: 用户名
    # 4. password:密码
    # 5. database: 操作的数据库
    # 6. charset: 操作数据库使用的编码格式
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           password="mysql",
                           database="python41",
                           charset="utf8")

    # 3. 获取游标, 目的就是要执行sql语句
    cursor = conn.cursor()
    # 准备sql, 之前在mysql客户端如何编写sql,在python程序里面还怎么编写
    sql = "select * from students;"

    # 4. 执行sql语句
    cursor.execute(sql)

    # 获取查询的结果, 返回的数据类型是一个元组取出结果集中一行数据, 例如:(1, '张三')
    # row = cursor.fetchone()
    # print(row)
    # 返回的数据类型是一个元组,其中元组里面的每条数据还是元组
    
    #取出结果集中的所有数据, 例如:((1, '张三'), (2, '李四'), (3, '王五'))
    result = cursor.fetchall()
    for row in result:
        print(row)

    # 5. 关闭游标
    cursor.close()
    # 6. 关闭连接
    conn.close()


5.pymysql完成对数据的增删改

import pymysql

if __name__ == '__main__':

    # 2. 创建连接对象
    # connect = Connection = Connect 本质上是一个函数,使用这三个里面的任何一个函数都可以创建一个连接对象
    # 1. host : 服务器的主机地址
    # 2. port: mysql数据库的端口号
    # 3. user: 用户名
    # 4. password:密码
    # 5. database: 操作的数据库
    # 6. charset: 操作数据库使用的编码格式
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           password="mysql",
                           database="python41",
                           charset="utf8")

    # 3. 获取游标, 目的就是要执行sql语句
    cursor = conn.cursor()
    # 准备sql, 之前在mysql客户端如何编写sql,在python程序里面还怎么编写
    # 注意点:对数据表完成添加、删除、修改操作,需要把修改的数据提交到数据库
    # sql = "insert into classes(name) values('python50');"
    # sql = "update classes set name = 'python45' where id= 5;"
    sql = "delete from classes where id=5;"

    try:
        # 4. 执行sql语句
        cursor.execute(sql)
        # 提交修改的数据到数据库
        conn.commit()
    except Exception as e:
        # 对修改的数据进行撤销,表示数据回滚(回到没有修改数据之前的状态)
        conn.rollback()
    finally:
        # 5. 关闭游标
        cursor.close()
        # 6. 关闭连接
        conn.close()

说明:conn.commit() 表示将修改操作提交到数据库
conn.rollback() 表示回滚数据

注:如果是查询的sql语句,可以不用commit提交数据。

6.防止sql注入

①.什么是sql注入?

用户提交带有恶意的数据与SQL语句进行字符串方式的拼接,从而影响了SQL语句的语义,最终产生数据泄露的现象。

import pymysql

if __name__ == '__main__':

    # 2. 创建连接对象
    # connect = Connection = Connect 本质上是一个函数,使用这三个里面的任何一个函数都可以创建一个连接对象
    # 1. host : 服务器的主机地址
    # 2. port: mysql数据库的端口号
    # 3. user: 用户名
    # 4. password:密码
    # 5. database: 操作的数据库
    # 6. charset: 操作数据库使用的编码格式
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           password="mysql",
                           database="python41",
                           charset="utf8")

    # 3. 获取游标, 目的就是要执行sql语句
    cursor = conn.cursor()
    # 准备sql, 之前在mysql客户端如何编写sql,在python程序里面还怎么编写
    sql = "select * from students where name = '%s';" % "黄蓉' or 1 = 1 or '"
    print(sql)

    # 4. 执行sql语句
    cursor.execute(sql)

    # 获取查询的结果, 返回的数据类型是一个元组
    # row = cursor.fetchone()
    # print(row)
    # 返回的数据类型是一个元组,其中元组里面的每条数据还是元组
    result = cursor.fetchall()
    for row in result:
        print(row)

    # 5. 关闭游标
    cursor.close()
    # 6. 关闭连接
    conn.close()

②.防止sql注入

SQL语句参数化SQL语言中的参数使用%s来占位,此处不是python中的字符串格式化操作
将SQL语句中%s占位所需要的参数存在一个列表中,把参数列表传递给execute方法中第二个参数

#防止SQL注入的示例代码:
# 1. 导包
import pymysql

if __name__ == '__main__':

    # 2. 创建连接对象
    # connect = Connection = Connect 本质上是一个函数,使用这三个里面的任何一个函数都可以创建一个连接对象
    # 1. host : 服务器的主机地址
    # 2. port: mysql数据库的端口号
    # 3. user: 用户名
    # 4. password:密码
    # 5. database: 操作的数据库
    # 6. charset: 操作数据库使用的编码格式
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           password="mysql",
                           database="python41",
                           charset="utf8")

    # 3. 获取游标, 目的就是要执行sql语句
    cursor = conn.cursor()
    # 准备sql, 使用防止sql注入的sql语句, %s是sql语句的参数和字符串里面的%s不一样,不要加上引号
    sql = "select * from students where name = %s;"
    print(sql)

    # 4. 执行sql语句
    cursor.execute(sql,("黄蓉",))

    # 获取查询的结果, 返回的数据类型是一个元组
    # row = cursor.fetchone()
    # print(row)
    # 返回的数据类型是一个元组,其中元组里面的每条数据还是元组
    result = cursor.fetchall()
    for row in result:
        print(row)

    # 5. 关闭游标
    cursor.close()
    # 6. 关闭连接
#execute方法中的 %s 占位不需要带引号

#防止sql注入多个参数的使用
# 1. 导包
import pymysql

if __name__ == '__main__':

    # 2. 创建连接对象
    # connect = Connection = Connect 本质上是一个函数,使用这三个里面的任何一个函数都可以创建一个连接对象
    # 1. host : 服务器的主机地址
    # 2. port: mysql数据库的端口号
    # 3. user: 用户名
    # 4. password:密码
    # 5. database: 操作的数据库
    # 6. charset: 操作数据库使用的编码格式
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           password="mysql",
                           database="python41",
                           charset="utf8")

    # 3. 获取游标, 目的就是要执行sql语句
    cursor = conn.cursor()
    # 准备sql, 使用防止sql注入的sql语句, %s是sql语句的参数和字符串里面的%s不一样,不要加上引号
    sql = "insert into students(name, age, gender, c_id) values(%s, %s, %s, %s)"
    print(sql)

    try:
        # 4. 执行sql语句
        # 1. sql
        # 2. 执行sql语句的传入的参数,参数类型可以是元组,列表,字典
        cursor.execute(sql,["司马懿", 76, '男', 3]);
        conn.commit()
    except Exception as e:
        conn.rollback()

    finally:
        # 5. 关闭游标
        cursor.close()
        # 6. 关闭连接
        conn.close()


三、pymsql示例

①查看mysql版本

import pymysql as mdb
#数据库相当于水库,定义变量 con 相当于一条水管,连接到水库
con = None
try:
    # con = mdb.connect('localhost', 'root', '123456', 'gdpi',port=3306);
    con = mdb.connect(host='localhost',user= 'root',password= '195375',database= 'ay', port=3306);
    #获取游标对象
    cur = con.cursor()
    #执行查询语句
    cur.execute ("SELECT VERSION()")
    #取得查询的结果,赋值给给变量 data
    data = cur.fetchone()
    print("Database version : %s " %data)
finally:
    if con:
        con.close()

②创建数据库表

#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='root',
                     password='195375',
                     database='ay')
 
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
 
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
 
# 使用预处理语句创建表
sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""
#执行语句 
cursor.execute(sql)
# 关闭游标
cursor.close()
# 关闭数据库连接
db.close()

③数据库插入操作

#①.方法1:
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='root',
                     password='195375',
                     database='ay')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 如果发生错误则回滚
   db.rollback()
# 关闭游标
cursor.close()  
# 关闭数据库连接
db.close()
#②方法2:
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='root',
                     password='195375',
                     database='ay')
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \\
       LAST_NAME, AGE, SEX, INCOME) \\
       VALUES ('%s', '%s',  %s,  '%s',  %s)" % \\
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # 执行sql语句
   cursor.execute(sql)
   # 执行sql语句
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
# 关闭游标
cursor.close()   
# 关闭数据库连接
db.close()

④数据库查询操作

Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
fetchall(): 接收全部的返回结果行.
rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:

import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='root',
                     password='195375',
                     database='ay')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \\
       WHERE INCOME > %s" % (1000)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 获取所有记录列表
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
       # 打印结果
      print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \\
             (fname, lname, age, sex, income ))
except:
   print ("Error: unable to fetch data")
# 关闭游标
cursor.close()  
# 关闭数据库连接
db.close()

⑤数据库更新操作

更新操作用于更新数据表的数据,以下实例将EMPLOYEE表中 SEX 为 ‘M’ 的 AGE 字段递增 1:

import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='root',
                     password='195375',
                     database='ay')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
# 关闭游标
cursor.close()  
# 关闭数据库连接
db.close()


⑥删除操作

删除操作用于删除数据表中的数据,以下实例演示了删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据:

import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='root',
                     password='195375',
                     database='ay')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交修改
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
# 关闭游标
cursor.close()  
# 关闭连接
db.close()

⑦错误处理

以上是关于Python学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记Python基础教程学习笔记

[Python笔记]Python学习笔记四

安全牛学习笔记python学习笔记

Python学习笔记

转载 《Python爬虫学习系列教程》学习笔记

python学习笔记