要求:
安装:
pymysql是第三方模块,可以使用pip、conda等命令安装
pip install pymysql
conda install pymysql
使用pycharm的话除了上面两种安装方式,还可以使用project python 安装第三方模块:
File >> setting >> Project:python >> project interpreter >> 右边 + ,查找pymysql然后install即可
先记一个大坑: 由于用的是虚拟机vmvare,忘记关闭firewalld服务,导致一直连接不上去,后面关掉就顺利连接上了。
1.navicat的连接数据库服务,不需要连接ssh
2.封装的TCP协议。服务端直接连接就好了。
创建一个表
CREATE TABLE `reg` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4;
一般流程:
1.创建连接返回值为Connection的实例对象connection连接
2.根据已有的连接对象connection创建curser游标对象
3.执行curser操作的方法
4.提交事务,释放资源
pymysql.connect常用参数说明:
参数 | 参数类型 | 含义 |
---|---|---|
host | str | MySQL服务器端地址 |
user | str | MySQL用户名 |
password | str | MySQL用户密码 |
database | str | 数据库名称 |
port | int | MySQL服务端端口号,默认3306 |
charset | str | 连接编码 |
更多参数请查看py源码
import pymysql
from pymysql.cursors import DictCursor
IP = "192.168.48.132" # mysql所在的服务host
USER = "ammmao" # mysql用户
PASSWORD = "353231" # mysql密码
DATABASE = "test"
PORT = 3306 # mysql服务的端口,默认是3306
CHARSET = "utf8"
conn = None
try:
conn = pymysql.connect(IP,USER,PASSWORD,DATABASE,PORT,charset=CHARSET)
finally:
if conn:
conn.close()
方法 | 含义 |
---|---|
①curser(curser=None) | 使用该连接创建并返回一个新的curser对象。参数curser表示游标的类型:Curser、SSCurser、DictCurser、SSDictCurser,可以通过from pymysql.cursers import导入 |
②commit() | 提交当前事务 |
③rollback() | 回滚当前事务 |
④close() | 关闭当前连接对象 |
注意:
connection对象支持上下文管理,查看源码py文件:
class Connection(object):
...
def __enter__(self):
return self.cursor() # 返回curser对象
def __exit__(self, exc, value, traceback):
if exc:
self.rollback()
else:
self.commit()
方法 | 含义 |
---|---|
①execute(query, args=None) | 执行一个查询,args用来进行参数化查询 |
②fetchone() | 获取结果集的下一行 |
③fetchmany(size=None) | 获取结果集的下几行,默认是一行 |
④fetchall() | 获取结果集中的所有行 |
⑤rowcount() | 返回数据条数或者影响行数 |
⑥rownumber() | 返回当前行号。可以修改,支持负数 |
⑦close() | 关闭游标对象 |
注意:
curser对象也支持上下文管理,查看源码py文件:
class Cursor(object):
def __enter__(self):
return self
def __exit__(self, *exc_info):
del exc_info
self.close()
结合connection对象演示简单的上下文管理进行数据库操作:
import pymysql
from pymysql.cursors import DictCursor
IP = "192.168.48.132" # mysql所在的服务host
USER = "ammmao" # mysql用户
PASSWORD = "353231" # mysql密码
DATABASE = "test"
PORT = 3306 # mysql服务的端口,默认是3306
CHARSET = "utf8"
conn = pymysql.connect(IP,USER,PASSWORD,DATABASE,PORT,charset=CHARSET)
with conn as curser: # 只能返回一个最基本的curser对象
with curser:
sql = "select * from reg"
curser.execute(sql)
for record in curser.fetchall():
print(record)
conn.close() # connection对象还是需要自己手动close()掉
import pymysql
from pymysql.cursors import DictCursor
IP = "192.168.48.132" # mysql所在的服务host
USER = "ammmao" # mysql用户
PASSWORD = "353231" # mysql密码
DATABASE = "test"
PORT = 3306 # mysql服务的端口,默认是3306
CHARSET = "utf8"
# 连接数据库
connect = pymysql.connect(IP, USER, PASSWORD, DATABASE, PORT, charset=CHARSET)
# 获取游标
curser = connect.cursor(DictCursor)
# 插入数据
sql1 = "INSERT INTO reg (id, name, age) VALUE(%s, %s, %s)"
data1 = (1, "老王", 38)
curser.execute(sql1, data1)
connect.commit()
print("成功插入{}条数据".format(curser.rowcount))
# 修改数据
sql2 = "UPDATE reg SET name=%s WHERE id=%s"
data2 = ("老牛",1)
curser.execute(sql2, data2)
connect.commit()
print("成功修改{}条数据".format(curser.rowcount))
# 查询数据
sql3 = "SELECT * FROM reg WHERE id=%s"
data3 = (1,)
curser.execute(sql3,data3)
connect.commit()
print("成功查询{}条数据".format(curser.rowcount))
# 删除数据
sql4 = "DELETE FROM reg WHERE id=%s"
data4 = (1,)
curser.execute(sql4, data4)
connect.commit()
print("成功删除{}条数据".format(curser.rowcount))
# 事务处理
sql5 = "INSERT INTO reg (id, name, age) VALUE (100,'小李',18)"
sql6 = "UPDATE reg SET name='小牛' WHERE id=100"
sql7 = "UPDATE reg SET age=10 WHERE id=100"
try:
curser.execute(sql5)
curser.execute(sql6)
curser.execute(sql7)
except Exception as e:
connect.rollback()
print("事务处理失败", e)
else:
connect.commit()
print("事务处理成功")
# 关闭连接
curser.close()
connect.close()
更多请参考PyMySQL