在python中连接mysql
一,pymysql的使用
首先在pycharm上装mysql
有三种方法
1.在文件setting那里查找pymysql 点+号 install 下载
2.创建一个py文件,然后导入import pymysql,此时会有红灯提示,点红灯第一个就是安装(install....)
3.在py文件控制台那里有个Terminal (它是装在系统的)
输入: pip install
import pymysql
def main():
# 1.建立连接
# host - 需要连接的数据库所在的主机地址(远程连接是ip地址(一般都用),本机使用localhost)
# user - 用户名
# password - 密码
# database - 数据库
# port - 端口
# charset - 编码方式
con_obj = pymysql.connect(host='39.105.169.15',
user='root',
password='root',
database='school',
port=3306,
charset='utf8',
autocommit=True)
print(con_obj)
# 2.获得游标对象 - 提供数据库操作的上下文 有了这部才能操作
# 注意:游标提供的上下文是事务环境 在创建时可以自动提交(autocommit=True)默认为False
with con_obj.cursor() as cursor:
# 在这儿后面操作数据库
# 3.操作数据库,执行sql语句: 连接对象.execute(sql语句) 里面是字符串
# 返回执行结果,这个sql操作影响的行(有错的话result那句就会崩溃)
try:
result = cursor.execute("update tb_teacher set teaage=25;")
print(result)
except:
print('操作失败')
finally:
# 关闭连接:连接对象.close()
con_obj.close()
# 事务提交
# con_obj.commit() 前面con_obj已经加了autocommit=True 自动提交
# 关闭连接:连接对象 操作就在他们之间写
# con_obj.close()
if __name__ == '__main__':
main()
二,数据的增删改查
import pymysql
def main():
# 1.建立连接
connect_obj = pymysql.connect('39.105.169.15',
'root',
'root',
'school',
3306,
charset='utf8',
autocommit=True)
# 2.获取游标
with connect_obj.cursor() as cursor_obj:
# 1)创建数据库
basa_name = input('需要创建的数据的名字(必须是英文):')
sqlstr = "creat database if not exists %s;" % base_name
result = cursor_obj.execute(sqlstr)
print(result)
# 2)删除数据库
# basa_name = input('需要创建的数据的名字(必须是英文):')
# cursor_obj.execute('drop database if exists %s;' % base_name)
# 3)使用数据库
# cursor_obj.execute('use python1;')
# 4)创建表
# cursor_obj.execute("""
# create table if not exists tb_person
# (
# pid int not null,
# pname varchar(20) not null,
# page int default 0,
# gender bit default 1,
# primary key(pid)
# );
# """)
# 5)删除表
# cursor_obj.execute('dorp table if exists tb_person;')
# 6)增删改
cursor_obj.executemany("""
insert into tb_person
(pid,name,page,gender)
values
(1,'张三',28,1),
(2,'小李',20,0);
""")
cursor_obj.execute('delete from tb_person where pid=4;')
cursor_obj.execute('update tb_person set pname="小明" where pname like "%三%";')
# 7)查:通过游标对象执行查询语句后,查询结果是保存在游标对象中
result = cursor_obj.execute('select * from tb_person;')
print(result)
# 游标对象.fetchall() - 获取查询结果,
# 结果是个元祖,元祖中的元素是一个小元祖代表的是每一条记录;小元祖中
#的元素是每一条记录中每个字段对应的值
# print(cursor_obj.fetchall())
# 这相当于一个生成式,取一个少一个,可以用变量保存来取值
all_person = cursor_obj.fetchall() # 用变量保存 此时是元祖
for p in all_person:
print('姓名:',p[0])
print('id:',p[1])
print('年龄:',p[2])
print(cursor_obj.fetchall()) # NONE 因为值已经被all_person赋予了
print(cursor_obj.fetchall()) # ()
# 关闭连接
# connect_obj.close()
if __name__ == '__main__':
main()
三,对象存储
import pymysql
class Student:
def __init__(self, name, age=0, gender=1, addr='', tel=''):
self.name = name
self.age = age
self.gender = gender
self.addr = addr
self.tel = tel
class Dog:
def __init__(self, name, color):
self.name = name
self.color = color
all_student = [
Student('小明', 20, 1, '四川成都', '18723674034'),
Student('罗浩', 30, 1, '四川德阳', '13723632333'),
Student('王海飞', 25, 1, '重庆', '18764344034'),
Student('苏玲', 22, 0, '湖南长沙', '13443445455')
]
# 将数据保存到数据库,通过函数封装
# 插入对象的时候按照对象的类型自动选择表,如果对应的表不存在就自动创建表
# 表的规则: Student类的对象 tb_Student表 Dog类对象 tb_Dog表中
def insert_object_database(obj, cursor):
# 1.获取对象对应的类型名
class_name = obj.__class__.__name__
table_name = 'tb_'+class_name
# 获取所有的字段,以逗号隔开
keys = ','.join(obj.__dict__.keys())
# 获取所有的值,以逗号隔开
values = ''
for item in obj.__dict__.values():
if isinstance(item, str):
values += "'%s'" % item
else:
values += str(item)
values += ','
values = values[:-1]
# 2. 插入数据 (%sid, %s)-插入对象(取出字段)
# insert into 表名 (字段1,字段2,字段3,...) values (值1,值2,值3,...)
insert_sql = '''insert into %s
(%sid, %s)
values
(null,%s);
''' % (table_name, table_name[3:6], keys, values)
try:
cursor.execute(insert_sql)
except pymysql.err.ProgrammingError:
filed = '' # 字段1 字段类型1, 字段2 字段类型2, ...
for key in obj.__dict__:
filed += key + ''
value = obj.__dict__[key]
if isinstance(value, str):
filed += ' text'
else:
filed += ' float'
filed += ','
filed = filed[:-1]
# 创建再插入
create_sql = "create table if not exists %s
(%sid int not null auto_increment, %s, primary key(%sid));" % (
table_name, table_name[3:6], filed, table_name[3:6])
cursor.execute(create_sql)
def main():
connect_obj = pymysql.connect(
host='39.105.169.15',
user='root',
password='root',
charset='utf8',
autocommit=True,
port=3306)
# 获取游标
# cursor(游标类型) - 游标类型默认是None,表示查询的时候结果是以元祖的形式返回;
# pymysql.cursor.DictCursor,表示查询的时候结果是以字典的形式返回
with connect_obj.cursor(pymysql.cursors.DictCursor) as cursor_obj:
# 创建数据库
# cursor_obj.execute('create database if not exists python2 default charset utf8;')
# 使用库
cursor_obj.execute('use python2;')
# 创建表存学生信息
# cursor_obj.execute('''
# create table if not exists t_student(
# stuid int not null auto_increment,
# name varchar(20),
# age int,
# gender bit,
# addr text,
# tel char(11),
# primary key(stuid)
# )
# ''')
# 插入数据
# for stu in all_student:
# inser_object_database(stu, cursor_obj)
# 一个一个的获取
# sql = '''insert into t_student(name,age,gander,addr,tel)
# values
# ("%s", %d, %d, "%s", "%s");''' % (stu.name, stu.age, stu.gender, stu.addr, stu.tel)
# cursor_obj.execute(sql)
# insert_object_database(Dog('大黄', '黄色'), cursor_obj)
# 获取数据
cursor_obj.execute('select * from tb_student;')
re = cursor_obj.fetchall()
for studict in re:
print(studict)
del_key = 'Stuid'
del studict[del_key]
stu = Student(**studict) # Student(Stuid=1,name='小明',age=20,gender=1,addr=...)
print(stu)
# 关闭连接
connect_obj.close()
if __name__ == '__main__':
main()