22、Python之mysql数据库操作

一、mysql

     mysql服务安装及使用方法,请自行百度,我们这里重点是学习如何使用python操作mysql数据库,需要用到模块pymysql,请听我娓娓道来。

python操作mysql的具体步骤如下:

1、导入pymysql模块 

import pymysql

2、连接mysql数据库

conn = pymysql.Connect(host='192.168.12.1',port=3306,user = 'root',passwd='1234',db='python',charset='utf8')

3、创建游标对象,用来操作数据库

cur = conn.cursor(cursor=pymysql.cursors.DictCursor) #创建cursor去执行sql  设置返回的数据为字典pymysql.cursors.DictCursor

4、编写sql语句

#创建表
sql = "CREATE TABLE student (id  INT auto_increment ,name VARCHAR (20) NOT NULL ,age int,mobile VARCHAR (11),PRIMARY KEY (id))"
#插入单条
sql = 'insert into student(id,name,age,mobile) values(10,"高文祥",18,"15800513051")'
#批量插入
info = [(3,'张惠',28,'15021811381')]
info.append((4,'zh',12,'18001484520'))
sql = 'insert into student(id,name,age,mobile) values(%s,%s,%s,%s)'
#更新操作
sql = 'update student set name = "C罗" where name = "高文祥"'
#查询
sql = 'select * from student'

上面的sql语句都是原生的mysql的语句。

5、执行操作

#单挑执行
cur.execute(sql)
#批量执行
cur.executemany(sql,info)

6、回滚or提交

conn.rollback()#回滚
conn.commit()#提交

7、关闭数据库连接

conn.close()#关闭连接

上述7个步骤就是python操作mysql的过程,下面是python查询数据后一些操作,我们在执行完cur.execute(sql)后,可以使用以下个方法来获取数据:

result = cur.fetchone()#取一行
result = cur.fetchall()#取所有行
for data in result:
    print(data)
cur.fetchmany(3)#取三行

二、ORM

     orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。

在Python中,最有名的ORM框架是SQLAlchemy,下面我们使用python中SQLAlchemy操作mysql数据库。

与上面一下,我们还是按步骤讲解。

1、导入sqlalchemy模块(包含了模块下使用到的一些类)

import sqlalchemy
from sqlalchemy.ext.declarative import  declarative_base
from sqlalchemy import Column,Integer,String
from sqlalchemy.orm import sessionmaker
from sqlalchemy import func

2、连接数据库

engine = sqlalchemy.create_engine("mysql+pymysql://root:1234@192.168.12.1:3306/python",encoding='utf-8',echo=False)#echo=Ture 表示需要打印日志

3、申明orm基类(其实就是生产一个orm的基类,后面我们自己的类去继承这个类)

Base = declarative_base() #生成orm基类

4、创建自定义类

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(32))
    password = Column(String(32))

上面定义的User类继承了Base类,类变量中定义了表名以及表的各个字段。

5、利用sqlalchemy创建表

Base.metadata.create_all(engine)#创建表

执行此句代码是表示:将所有继承Base的类创建数据库表,上面我们的User类继承了Base,所以会在数据库中创建user表

6、创建数据库会话实例

Session_class = sessionmaker(bind=engine) #创建与数据库会话类
session = Session_class() #创建实例

7、利用sqlalchemy对表进行增删改查操作

      1、添加一条数据

user_obj = User(name='root',password='123456')
session.add(user_obj) #插入一条数据

     2、添加多条数据

user_obj = User(name='root',password='123456')
user_obj_01 = User(name='zh',password='456')
user_obj_list = []
user_obj_list.append(user_obj)
user_obj_list.append(user_obj_01)
session.add_all(user_obj_list)#插入多条数据

    3、查询数据

session.query(User).filter(User.name.in_ (['root'])).all() #查询user表中,用户名in[‘root’]的所有记录
session.query(User).filter(User.id<3).filter(User.id>1).all()#查询user表中id<3同时id>1的所有数据
session.query(User).filter(User.name.like("g%")).count()#统计user表中name like "g%" 的记录条数
session.query(func.count(User.name),User.name).group_by(User.name).all() #根据name分组展示所有数据

执行查询后,上面的语句返回的是User的对象列表,然后我们可以通过这个列表实现对数据的操作,如下:

my_users = session.query(User).filter_by(name='gwx').all() #查询所有 first是查询第一条数据 返回的结果是一个对象的列表
for user in my_users:
    print(user.id,user.name,user.password)#遍历所有数据

    4、修改数据

上面,我们通过查询出数据后,就可以直接对数据进行修改,即为:

my_user[0].name = 'liudehua' #更新 这种形式

    5、删除数据,删除数据也是类似。

session.delete(my_user[0]) #删除数据

8、回滚

session.rollback()

9、提交

session.commit()#提交统一创建

三、多表查询实例

    下面的代码实现了一个多表查询的操作,主要有三个表,course,student,teacher。

 1 import sqlalchemy
 2 from sqlalchemy.ext.declarative import  declarative_base
 3 from sqlalchemy import Column,Integer,String,Boolean,ForeignKey
 4 from sqlalchemy.orm import sessionmaker,relationship
 5 from sqlalchemy import func
 6 
 7 engine = sqlalchemy.create_engine("mysql+pymysql://root:1234@192.168.12.1:3306/python",encoding='utf-8',
 8                                   echo=False)#echo=Ture 表示需要打印日志
 9 
10 Base = declarative_base() #生成orm基类
11 
12 class Course(Base):
13     __tablename__ = 'course'
14     course_no = Column(String(11),primary_key=True)
15     name = Column(String(12),nullable=False)
16     is_valid = Column(Boolean)
17 
18 class Student(Base):
19     __tablename__ = 'student'
20     id = Column(Integer,primary_key=True,autoincrement=True)
21     stu_no = Column(String(11),primary_key=True)
22     name = Column(String(12),nullable=False)
23     mobile = Column(String(11))
24     is_valid = Column(Boolean)
25     course_no = Column(String(11),ForeignKey('course.course_no'))
26     '''关联查询'''
27     shipping_course = relationship("Course",backref="Student")
28 
29 class Teacher(Base):
30     __tablename__ = 'teacher'
31     teacher_no = Column(String(11),primary_key=True)
32     name = Column(String(11),nullable=True)
33     is_valid = Column(Boolean)
34     course_id = Column(String(11),ForeignKey('course.course_no'))
35 # Base.metadata.create_all(bind=engine,checkfirst=True)
36 
37 
38 Session_class = sessionmaker(bind=engine)
39 session = Session_class()
40 # session.add(Course(course_no='0001',name='python',is_valid=True))
41 # session.add(Student(stu_no='112031204',name='gaowenxiag',mobile='15800513051',course_no='0001',is_valid=True))
42 # session.add(Teacher(teacher_no='1001',name='helen',is_valid=True,course_id='0001'))
43 # result = session.query(Student.name,Course.name,Teacher.name).filter(Student.course_no==Course.course_no).filter(Course.course_no==Teacher.course_id)
44 result = session.query(Student).filter(Student.name == 'gaowenxiag').all()
45 for i in result:
46     print(i.shipping_course.name)
47 session.commit()
View Code

这里有一个概念需要注意的是"关联查询"

shipping_course = relationship("Course",backref="Student")

这句话的意思是student查询出来的结果,可以通过取shipping_course字段去查询与之关联的数据,类似于外键的作用,但这区别于外键,因为这种关系是存在于内存中的。

result = session.query(Student).filter(Student.name == 'gaowenxiag').all()
for i in result:
    print(i.shipping_course.name)

上面这段代码的是先查询出学生表中name=‘gaowenxiag’的所有记录,然后遍历没一条数据,在遍历的时候通过i.shipping_course.name去获得与该学生记录关联的课程的name。

原文地址:https://www.cnblogs.com/win0211/p/8630123.html