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 = "[email protected]"
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, "北京海淀", "[email protected]"),
("李四", 21, 1, "天津南開", "[email protected]"),
("孫儷", 19, 0, "北京東城", "[email protected]"),
("趙錢", 22, 1, "遼寧大連", "[email protected]"),
("王五", 20, 1, "河北石家莊", "[email protected]")
]
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, '北京朝陽', '[email protected]')]
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` = '張三']