两种方法进行数据库的连接分别是 PyMySQLmysql.connector,我们学习 PyMySQL

操作步骤:

  1. 连接数据库 conn = pymysql.connect()
  2. 生成游标对象 curosr = conn.cursor()
  3. 执行SQL语句 cursor.execute(sql)
  4. 关闭游标 cursor.close()
  5. 关闭连接 conn.closr()

PyMySQL 是在 Python3.4 以后版本中用于连接 MySQL 数据库的一个模块;

Python2 中则使用 mysqldb

安装 PyMySQL

首先要安装这个模块:

pip install pymysql

检查一下是否安装成功:

pip show pymysql

PyMySQL 连接数据库

import pymysql

# 创建数据库连接
conn = pymysql.connect(
    host = '127.0.0.1', # 连接主机, 默认127.0.0.1 
    user = 'root',      # 用户名
    passwd = '1234',# 密码
    port = 3306,        # 端口,默认为3306
    db = 'test',        # 数据库名称
    charset = 'utf8'    # 字符编码
)

# 生成游标对象 cursor
cursor = conn.cursor()

# 查询数据库版本
cursor.execute("select version()") # 返回值是查询到的数据数量
# 通过 fetchall方法获得数据
data = cursor.fetchone()
print("Database Version:%s" % data)

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

创建数据库(数据库必须存在)

由于连接数据库时需要填要连接的数据库名,所以创建数据库只能做到:删除已经存在的数据库,再重新创建,相当于 清空数据库 的作用。

# 创建数据库 test
cursor.execute("drop database if exists test")  #如果数据库已经存在,那么删除后重新创建
sql = "create database test"
cursor.execute(sql) 

创建数据表

# 创建数据表
cursor.execute("drop table if exists employee")  # 如果数据表已经存在,那么删除后重新创建
sql = """
CREATE TABLE employee (
    id VARCHAR(20) NOT NULL,
    name VARCHAR(20),
    age INT,
    income FLOAT 
)
"""
cursor.execute(sql)

插入操作

# 数据库插入数据
sql = "INSERT INTO employee VALUES ('1', '张三', 20, 5000)"
try:
    cursor.execute(sql)
    # 提交当前游标的全部操作
    conn.commit()
except:
    print("expection!")
    conn.rollback()

# 查看更新后的结果
sql = "SELECT* FROM employee"
cursor.execute(sql)
data = cursor.fetchall()
print(data)

查询操作

只查询出一条数据:cursor.fetchone()

sql = "SELECT* FROM employee"
cursor.execute(sql) # 返回值是查询到的数据数量
data = cursor.fetchone() # 查询一条数据
print(data)

查询数据库中所有数据:cursor.fetchall()

# 数据库查询数据
sql = "SELECT * FROM employee"
cursor.execute(sql) # 返回值是查询到的数据数量
data = cursor.fetchall() # 查询一条数据
print(data)

查询指定条件的数据:查询满足条件 income > 5000 的数据。

# 查询指定条件的数据
sql = " SELECT * FROM employee WHERE income > '%d' " % (5000)
cursor.execute(sql) # 返回值是查询到的数据数量
data = cursor.fetchone()
print(data)

更新操作

# 更新数据库
sql = " UPDATE employee SET age = age + 1 WHERE age < '%d' " % (25)
try:
    cursor.execute(sql)
    conn.commit()
except:
    print("expection!")
    conn.rollback()

# 查看更新后的结果
sql = "SELECT* FROM employee"
cursor.execute(sql)
data = cursor.fetchall()
print(data)

删除操作

# 删除数据
sql = "DELETE FROM employee WHERE age > '%d' " % (30)
try:
    cursor.execute(sql)
    conn.commit()
except:
    print("exce[tion!")
    conn.rollback()

#查看更新后的结果
sql = "select * from employee"
cursor.execute(sql)
data = cursor.fetchone()
print(data)

综合案例

保证数据库中有 test 表:

import pymysql
import traceback
from time import sleep

class PyMySQL(object):
    create_table = """
        CREATE TABLE stu (   
            id INT not null PRIMARY KEY AUTO_INCREMENT,
            name VARCHAR(255) NOT NULL,
            age INT, 
            sex VARCHAR(255)
        ) DEFAULT CHARSET = utf8
    """
    select = 'SELECT * FROM stu'
    update = 'UPDATE stu SET name = "明明" WHERE id=2'
    delete = 'DELETE FROM stu WHERE id=9'
    insert = 'INSERT INTO stu(name, age, sex) VALUES("%s", "%d", "%s")' % ('小明', 2, "男")

    def __init__(self, host, user, pwd, db):
        self.conn = pymysql.connect(host, user, pwd, db)
        self.cursor = self.conn.cursor()
        print("数据库连接成功!")
    
    def closeAll(self):
        self.conn.close()
        self.cursor.close()
        print("资源释放完毕!")

    def create_table_func(self):
        self.cursor.execute("DROP TABLE IF EXISTS stu")
        self.cursor.execute(PyMySQL.create_table)
        print('数据表创建完毕')

    def insert_date(self):
        try:
            self.cursor.execute(PyMySQL.insert)
            self.conn.commit()
            print("数据插入成功!")
        except:
            print(traceback.format_exc())
            self.conn.rollback()
            print("数据插入失败!")

    def update_data(self):
        try:
            self.cursor.execute(PyMySQL.update)
            self.conn.commit()
            print("数据更新成功!")
        except:
            print(traceback.format_exc())
            self.conn.rollback()
            print("数据更新失败!")

    def delete_data(self):
        try:
            self.cursor.execute(PyMySQL.delete)
            self.conn.commit()
            print("数据删除成功!")
        except:
            print(traceback.format_exc())
            self.conn.rollback()
            print("数据删除失败!")

    def select_data(self):
        self.cursor.execute(PyMySQL.select)
        all_data = self.cursor.fetchall()
        for i in all_data:
            print('查询结果为:{}'.format(i))

if __name__ == '__main__':
    my = PyMySQL('localhost','root','1234','test')
    my.create_table_func()
    my.insert_date()
    my.update_data()
    my.delete_data()
    my.select_data()
    my.closeAll()

Connection Object

Connection 类提供以下方法:

  1. .close()
    从这一点开始,连接将不可用;如果试图对连接执行任何操作,将会引发错误(或子类)异常
  2. .commit()
    将操作提交到数据库;
    如果数据库支持自动提交特性,则必须首先关闭此功能;
    可以提供一个接口方法将其重新打开;
  3. .cursor()
    创建游标,用于执行 SQL 语句
  4. .rollback()
    此方法是可选的,因为并非所有数据库都提供事务支持;
    如果数据库确实提供事务,此方法将导致数据库回滚到任何挂起事务的开始;
    在不首先提交更改的情况下关闭连接将导致执行隐式回滚;

Cursor Objects

游标对象具有以下常用方法

  1. .close()
    关闭游标对象,从这一点开始,游标对象将不可用;
    如果试图使用游标执行任何操作,将引发错误(或子类)异常。
  2. .execute()
    执行数据库操作(查询或命令等SQL语句);
    返回值没有定义。
  3. .fetchone()
    获取查询结果的下一行,返回单个序列,或者在没有更多数据可用时返回 None
    如果 execute() 的调用没有生成任何结果,或者还没有执行,则会引发错误(或子类)异常。
  4. .fetchall()
    获取查询结果的所有(剩余)行,以序列的形式返回它们(例如元组列表)
    如果前面对 .execute() 的调用没有生成任何结果集,或者还没有发出调用,则会引发错误(或子类)异常。
Logo

更多推荐