Python 操作 MySQL 之 PyMySQL

1.pymysql 介绍

       Python 中连接 MySQL 服务器有两个库,分别为 PyMySQL 和 MySQLdb,

       PyMySQL 是在 Python 3.x 版本中用于连接 MySQL 服务器的一个库,MySQLdb 只支持到 Python3.4,如果是 Python3.5+ 以上的版本,安装时会报缺少包。

       两者使用方法一样,即使在 Python3.4 以下版本中安装 MySQLdb 也总是报缺少各种包,网上查询的解决方法也不可以,PyMySQL 既支持 Python 2 也支持 Python 3,安装简单方便,所以建议使用 PyMySQL

2.pymysql 安装

安装命令如下

pip install PyMySQL

有些之前的项目中依然使用的是MySQLdb库,可以使用如下命令安装

pip install MySQL-Python --user --global-option=build_ext --global-option="-I/usr/local/opt/openssl/include" --global-option="-L/usr/local/opt/openssl/lib"

3.pymysql 使用

笔者代码中使用了 logging 日志模块,没有安装的使用如下命令安装即可

pip install logging

代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import logging
import pymysql
import pytz
import time
import traceback

"""
    日志配置
        level=日志等级
        datefmt=时间格式
        format=日志格式
"""
logging.basicConfig(
    level=logging.INFO,
    datefmt='%Y-%m-%d %H:%M:%S',
    format='%(asctime)s [%(levelname)s] %(message)s'
)


class Constants(object):
    TIMEZONE = pytz.timezone('Asia/Shanghai')

    MYSQL_KEY_HOST = "host"
    MYSQL_KEY_USER = "user"
    MYSQL_KEY_PASSWORD = "password"
    MYSQL_KEY_PORT = "port"
    MYSQL_KEY_DATABASE = "database"


class MySQLDBHelper(object):
    """
        初始化连接
    """
    def __init__(self, config):
        host = config[Constants.MYSQL_KEY_HOST]
        if host is None:
            raise ValueError("Parameter [host] is None.")

        port = config[Constants.MYSQL_KEY_PORT]
        if port is None:
            raise ValueError("Parameter [port] is None.")

        username = config[Constants.MYSQL_KEY_USER]
        if username is None:
            raise ValueError("Parameter [username] is None.")

        password = config[Constants.MYSQL_KEY_PASSWORD]
        if password is None:
            raise ValueError("Parameter [password] is None.")

        database = config[Constants.MYSQL_KEY_DATABASE]
        if database is None:
            raise ValueError("Parameter [database] is None.")

        logging.debug("[%s] 数据库初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>开始" % database)
        start = time.time()

        self.host = host
        self.username = username
        self.password = password
        self.port = port
        self.database = database

        self.conn = None
        self.cursor = None

        try:
            self.conn = pymysql.connect(**config)
            self.cursor = self.conn.cursor()
            end = time.time()
            logging.debug("[%s] 数据库初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>结束" % database)
            logging.info("[%s] 数据库初始化成功。耗时:%d ms。" % (database, (end - start)))
        except Exception as e:
            logging.error("数据库初始化失败!")
            logging.error(traceback.format_exc())

    """
        释放资源
    """
    def close(self):
        try:
            if not self.conn:
                self.conn.close()
        except Exception as e:
            logging.error("数据库连接释放异常!")
            logging.error(traceback.format_exc())

    """
        创建表
    """
    def create_table(self, sql):
        try:
            logging.info("[%s] SQL >>> [%s]" % (self.database, sql))
            self.cursor.execute(sql)
            self.conn.commit()
        except Exception as e:
            logging.error(traceback.format_exc())

    """
        执行查询 SQL 语句
        :param str sql: 查询sql
        :param bool single: 是否查询单个结果集,默认False
        
        :return: 返回查询数据
        :rtype: list tuple [(e1, e2, ...), (e1, e2, ...), ...]
    """
    def execute_query(self, sql, single=False):
        try:
            logging.info("[%s] SQL >>> [%s]" % (self.database, sql))
            self.cursor.execute(sql)
            if single:
                result_tuple = self.cursor.fetchone()
            else:
                result_tuple = self.cursor.fetchall()
            return result_tuple
        except Exception as e:
            logging.error(traceback.format_exc())

    """
        执行 SQL 语句
        :param str sql: 插入、删除、修改

        :return: 返回受影响行数
        :rtype: int
    """
    def execute_commit(self, sql):
        try:
            logging.info("[%s] SQL >>> [%s]" % (self.database, sql))
            affect_rows = self.cursor.execute(sql)
            self.conn.commit()
            return affect_rows
        except Exception as e:
            self.conn.rollback()
            logging.error(traceback.format_exc())

    """
        批量插入
        :param str sql: 插入

        :return: 返回受影响行数
        :rtype: int
    """
    def insert_many(self, sql, values):
        try:
            affect_rows = self.cursor.executemany(sql, values)
            self.conn.commit()
            return affect_rows
        except Exception as e:
            self.conn.rollback()
            logging.error("[%s] SQL >>> [%s] param >>> %s" % (self.database, sql, values))
            logging.error(traceback.format_exc())


if __name__ == '__main__':
    # 初始化连接
    config = {
        Constants.MYSQL_KEY_HOST: '127.0.0.1',
        Constants.MYSQL_KEY_PORT: 3306,
        Constants.MYSQL_KEY_USER: 'root',
        Constants.MYSQL_KEY_PASSWORD: '123456',
        Constants.MYSQL_KEY_DATABASE: 'test_db'
    }

    db = MySQLDBHelper(config=config)

    # 创建表
    create_table_sql = """
                        CREATE TABLE IF NOT EXISTS `students` (
                          `id` int(11) NOT NULL AUTO_INCREMENT,
                          `name` varchar(50) NOT NULL,
                          `age` int(11) NOT NULL,
                          `gender` int(11) NOT NULL,
                          `address` varchar(100) NOT NULL,
                          `email` varchar(50) NOT NULL,
                          PRIMARY KEY (`id`)
                        ) ENGINE=InnoDB DEFAULT CHARSET=utf8"""
    db.create_table(create_table_sql)

    # 插入数据
    name = "张三"
    age = 18
    gender = 1
    address = "北京朝阳"
    email = "1@qq.com"
    insert_sql = """insert into students(`name`, `age`, `gender`, `address`, `email`) values ('%s', %d, %d, '%s', '%s')""" % (name, age, gender, address, email)
    db.execute_commit(insert_sql)

    # 批量插入数据
    insert_many_sql = """insert into students(`name`, `age`, `gender`, `address`, `email`) values (%s, %s, %s, %s, %s)"""
    values = [
        ("李丽", 20, 0, "北京海淀", "2@qq.com"),
        ("李四", 21, 1, "天津南开", "3@qq.com"),
        ("孙俪", 19, 0, "北京东城", "4@qq.com"),
        ("赵钱", 22, 1, "辽宁大连", "5@qq.com"),
        ("王五", 20, 1, "河北石家庄", "6@qq.com")
    ]
    db.insert_many(insert_many_sql, values)

    # 更新数据
    name = "张三"
    age = 22
    address = "河北保定"
    update_sql = """update students set `age` = %d, `address` = '%s' where `name` = '%s'""" % (age, address, name)
    db.execute_commit(update_sql)

    # 删除数据
    name = "张三"
    delete_sql = """delete from students where `name` = '%s'""" % name
    db.execute_commit(delete_sql)

    # 释放连接
    db.close()

运行结果:

2019-10-31 19:20:39 [INFO] [test_db] 数据库初始化成功。耗时:0 ms。
2019-10-31 19:20:39 [INFO] [test_db] SQL >>> [
                        CREATE TABLE IF NOT EXISTS `students` (
                          `id` int(11) NOT NULL AUTO_INCREMENT,
                          `name` varchar(50) NOT NULL,
                          `age` int(11) NOT NULL,
                          `gender` int(11) NOT NULL,
                          `address` varchar(100) NOT NULL,
                          `email` varchar(50) NOT NULL,
                          PRIMARY KEY (`id`)
                        ) ENGINE=InnoDB DEFAULT CHARSET=utf8]
2019-10-31 19:20:39 [INFO] [test_db] SQL >>> [insert into students(`name`, `age`, `gender`, `address`, `email`) values ('张三', 18, 1, '北京朝阳', '1@qq.com')]
2019-10-31 19:20:39 [INFO] [test_db] SQL >>> [update students set `age` = 22, `address` = '河北保定' where `name` = '张三']
2019-10-31 19:20:39 [INFO] [test_db] SQL >>> [delete from students where `name` = '张三']
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值