python操作mysql数据库需要安装一下库
pip install pymysql
可以通过pip list 查看是否已经安装
操作步骤
#导入包
import pymysql
#链接数据库
dg_config = {
'host':'ip',
'port':'端口',
'user':'账号',
'password':'密码',
'db':'数据库名',
'charset':'utf8',
}
my_conn = pymysql.connect(**dg_config)
-
链接数据库
import pymysql #链接数据库 dg_config = { 'host':'127.0.0.1', 'port':'3306', #默认端口就为3306 'user':'root', 'password':'qwe123', 'db':'my_workdb', 'charset':'utf8', }
-
创建链接
my_conn = pymysql.connect(**dg_config)
-
创建游标 cursor
cur = my_conn.cursor()
-
执行mysql语句cur.excute() 括号内为mysql的增删查改语句
res = cur.execute("select *from stu_info") #res可以获取查询得到的数据 #以下方式获取结果 #获取一条数据 one = cur.fetchone(self) #获取制定条数 many = cur.fetchmany(self,size) #获取全部数据 all = cur.fetchall(self) #上述结果可以使用循环打印出来 for res in all: print(res) #可以通过逐条获取来获得需要的数据,避免获取所有内存不够 while one: print(one) one = fetchone(self)
-
提交数据commit
my_conn.commit()
-
关闭游标
cur.close
-
关闭链接
my_conn.close()
-
上下文管理
利用上下文管理,可以不用执行关闭游标和关闭链接的操作
with my_conn.courser() as cur cur.execute("select *from stu_info") #执行语句代码块 #提交数据 my_conn.commit() #或者回滚数据 my_conn.rollback()
完整代码如下
import pymysql
class Mysql(object):
def __init__(self):
try:
#打开数据库连接
#连接数据库所需的值,可以在__init__()中传入
self.conn = pymysql.connect(
host = 'localhost',
port = 3306,
user = "root",
passwd = 'root',
db = "test",
charset = 'utf8'
)
except Exception as e:
print(e)
else:
print("connect successfully")
# 使用 cursor() 方法创建一个游标对象 cursor
self.cur = self.conn.cursor()
#创建表
def create_table(self):
try:
# 使用 execute() 方法执行 SQL,如果表存在则删除
self.cur.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 )"""
#执行sql语句
self.cur.execute(sql)
print("create table success")
except Exception as e:
print("create table error\n" + e)
def add(self):
#数据库插入语句
sql = """insert into EMPLOYEE(First_Name,
Last_Name,Age,Sex,Income)
values('Mac','Mohan',20,'F',2000);"""
try:
self.cur.execute(sql)
# 提交到数据库执行
self.conn.commit()
except Exception as e:
print(e)
# 发生错误时回滚
self.conn.rollback()
print("fail to add new data")
else:
print("insert data seccess!")
# Python查询Mysql使用
# fetchone()方法获取单条数据, 使用fetchall()方法获取多条数据。
# fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
# fetchall(): 接收全部的返回结果行.
# rowcount: 这是一个只读属性,并返回执行execute()
# 方法后影响的行数。
def show(self):
sql = "select * from employee"
try :
self.cur.execute(sql)
#fetchall()返回的结果是list,list里面再嵌套list
res = self.cur.fetchall()
for row in res:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印结果
print("\n fname =%s,lname =%s,age = %d, sex=%s,income=%d \n " % (fname, lname, age, sex, income))
except Exception as e:
print(e + "select data fail")
else:
print("select data success")
#更新数据库
def upodate(self):
sql = "update employee set age = age + 1 where sex ='%c'" %("m")
try:
self.cur.execute(sql)
self.conn.commit()
except Exception as e:
print(e)
else:
print("update data success")
#删除数据库中数据
def rem(self):
sql = 'delete from employee where sex = "M"'
try:
self.cur.execute(sql)
self.conn.commit()
except Exception as e:
print(e)
else:
print("delete data success")
#关闭数据库连接
def close(self):
self.cur.close()
self.conn.close()
print("close database success")
if __name__ == "__main__":
mysql = Mysql()
mysql.create_table()
mysql.add()
mysql.show()
mysql.upodate()
mysql.rem()
mysql.close()
封装示例
我自己写的封装
#把mysql数据表插入一万条数据,这个表结构可以自己定
import pymysql
import logging
from databases.exam.my_imagelogger import My_logger
import random
import string
import re
#py操作mysql数据库
class My_sql(object):
def __init__(self,host,user,passwd,db,charset='utf8',port=3306,):
try:
#打开数据库连接
#连接数据库所需的值,可以在__init__()中传入
self.conn = pymysql.connect(
host = host,
port = port,
user = user,
passwd = passwd,
db = db,
charset = charset
)
self.logger=My_logger('sql_log',logging.DEBUG,'sql_log.log').create_Logger()
# self.logger = logging.getLogger('my_log')
except Exception as e:
self.logger.error('数据库连接失败,错误内容:{}'.format(e))
else:
self.logger.info('数据库连接成功!')
# 使用 cursor() 方法创建一个游标对象 cursor
self.cur = self.conn.cursor()
#添加数据
def insert_Data(self,sql):
try:
self.cur.execute(sql)
ins = re.findall(r'insert', sql)
if ins[0] != 'insert':
raise NameError('这不是查询语句!')
# 提交到数据库执行
self.conn.commit()
except Exception as e:
# 发生错误时回滚
self.logger.debug('数据插入失败,错误内容:{}'.format(e))
self.conn.rollback()
else:
self.logger.info('数据插入成功!')
#查询数据
def select_Data(self,sql):
try:
self.cur.execute(sql)
ins = re.findall(r'select', sql)
if ins[0] != 'select':
raise NameError('这不是查询语句!')
# fetchall()返回的结果是list,list里面再嵌套list
results = self.cur.fetchall()
except Exception as e:
self.logger.debug('数据查询失败,错误内容:{}'.format(e))
else:
self.logger.info('数据查询成功!')
for res in results:
print(res)
#修改数据
def updata_Data(self,sql):
try:
self.cur.execute(sql)
ins = re.findall(r'updata',sql)
if ins[0] !='updata':
raise NameError('这不是修改语句!')
except Exception as e:
# 发生错误时回滚
self.conn.rollback()
self.logger.debug('数据修改失败,错误内容:{}'.format(e))
else:
#提交修改
self.conn.commit()
self.logger.info('数据修改成功!')
#删除数据
def delete_Data(self,sql):
try:
self.cur.execute(sql)
ins = re.findall(r'delete', sql)
if ins[0] != 'delete':
raise NameError('这不是删除语句!')
except Exception as e:
# 发生错误时回滚
self.conn.rollback()
self.logger.debug('数据删除失败,错误内容:{}'.format(e))
else:
self.conn.commit()
self.logger.info('数据删除成功!')
#关闭数据库
def close_Database(self):
self.cur.close()
self.conn.close()
self.logger.info('数据关闭成功!')
if __name__ == '__main__':
mysqldb = My_sql('127.0.0.1','root','qwe123','my_workdb')
# mysqldb.select_Data('select *from stu_info')
#插入一万条学生数据
#学生id,id自增加
stu_id = 21
for i in range(10000):
stu_id+=1
#学生名字
# 随机学生名字
name = "".join(random.sample(string.ascii_letters, random.randint(3, 7)))
#学生年龄随机12-40之间
age = random.randint(12, 40)
#随机学院id 5个学院 1-5
col_id = random.randint(1, 5)
#随机班级,班级也是1-5
grade = 'class'+ str(random.randint(1, 5))
#生成插入的sql语句 insert into tb_name values('jiuchen','F',1,18);
sql = " ".join(['insert into','stu_info','values',str((str(stu_id),name,str(age),str(col_id),grade)),';'])
print(sql)
mysqldb.insert_Data(sql)
# mysqldb.delete_Data('delete from stu_info where stu_id>20; ')
mysqldb.close_Database()