一、使用pymysql

pymasql:是一个第三方模块,并且要求python版本为3.4以上。

在python2中使用的是mysqldb。

安装

在命令行中执行

pip install pymysql

使用

1.连接数据库

2.创建游标

3.定义sql语句

4.执行sql语句

5.关闭连接

获取返回内容

1.fetchone():函数,获取返回的一条数据

2.fetchall():函数,获取返回的全部数据

3.rowcount:属性,获取操作影响的行数

实例

import pymysql

# 1.连接数据库
# 数据默认返回的数据结果是元组类型,不易于操作
# 加上参数cursorclass=pymysql.cursors.DictCursor,fetchone()结果为字典,fetchall()结果为列表内嵌字典
db=pymysql.connect(host='localhost', user='root', password="181818",database='demo',cursorclass=pymysql.cursors.DictCursor)

# 2.创建游标对象
cursor=db.cursor()

# 3.定义sql语句
# 版本号
# sql='select version()'
# 查询
sql='select *from user'
# 添加
# sql='insert into user(id,name) values(25,"明明")'
# 更新
# sql='update user set id=5 where name="明明"'

# 4.执行sql语句
cursor.execute(sql)
# 获取返回结果
print(cursor.fetchone())    # 一次获取一行
print(cursor.fetchone())
print(cursor.fetchall())    # 一次获取余下所有行
print(cursor.rowcount)    # 获取操作影响的行数

# 如果操作对数据库中的操作产生影响(增删改),必须提交,否则将不会生效
db.commit()

# 5.断开连接
cursor.close()
db.close()

封装及使用

封装类

mysql.py

import pymysql

class MyDB:
    def __init__(self,p,db,h='localhost',u='root'):
        # 连接数据库,创建游标对象
        self.db=pymysql.connect(host=h, user=u, password=p,database=db,cursorclass=pymysql.cursors.DictCursor)
        self.cursor=self.db.cursor()
    # 查询
    def query(self,sql):
        self.cursor.execute(sql)
        return self.cursor.fetchall()
    # 增删改
    def change(self,sql):
        self.cursor.execute(sql)
        self.db.commit()
        return self.cursor.rowcount
    def __del__(self):
        # 关闭数据库连接
        self.cursor.close()
        self.db.close()

if __name__ == '__main__':    # 一般用于测试
    database = MyDB('181818','demo')
    print(database.query('select * from user'))
使用

mydb_demo.py

from mydb import MyDB

# 实例化数据库对象
database=MyDB('181818','demo')

sql='insert into user values(7,"小茜")'
print(database.change(sql))

sql='select * from user'
print(database.query(sql))

二、使用ORM

ORM,全称Object Relational Mapping,意为对象关系映射。

ORM是一个操作数据库的框架
ORM会将python代码翻译成对应数据库的sql语句
ORM会将数据库中的表,映射成python中的类

一张表就是一个类,将表中的字段映射成对象的属性。

:所以我们在使用ORM时,可以不关心用的是什么数据库,只专心关心业务逻辑。即使开发人员不会sql语句,也能与数据库进行交互。

:ORM生成的sql语句,不是最优的sql语句,执行效率会比较低。

python中有一个ORM,即sqlalchemy。

仿照的是Django框架的ORM。

flask中有一个ORM插件:flask-sqlalchemy。

安装

在命令行执行

pip install sqlalchemy

使用

1.导包

2.创建连接

3.声明一个基类

4.创建类–数据模型

5.操作

!!注意:重复执行py文件时,不会重复建表。

实例

创建表

pymysql 千万级数据快速 insert 到数据库_MySQL

import sqlalchemy
# 1.导包
from  sqlalchemy.ext.declarative import declarative_base
# 类似于pymysql中的游标
from sqlalchemy.orm import sessionmaker

# 2.创建连接
# 数据库类型+数据库操作的包://用户名:密码@IP地址/数据库
# 有mysqlclient包时,mysql+pymysql可改为mysql
db=sqlalchemy.create_engine('mysql://root:181818@localhost/sqlorm')

# 3.创建基类
base=declarative_base(db)

# 4.创建表--数据模型
class User(base):
    # 表名
    __tablename__='user'
    # 字段
    id=sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
    name=sqlalchemy.Column(sqlalchemy.String(32))
    age=sqlalchemy.Column(sqlalchemy.Integer)
class Userinfo(base):
    __tablename__='userinfo'
    id=sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
    phone = sqlalchemy.Column(sqlalchemy.String(20))

if __name__ == '__main__':
    # 执行数据库迁移(创建表)
    base.metadata.create_all(db)

pymysql 千万级数据快速 insert 到数据库_pymysql_02

对表进行操作
if __name__ == '__main__':
    # 执行数据库迁移(创建表)
    base.metadata.create_all(db)
    # 绑定一个session实例
    s=sessionmaker(bind=db)
    # 创建一个会话对象,类似于游标
    session=s()

# 数据库操作
    # 添加
    # 单条插入
    # user=User(name='hello',age=16)
    # session.add(user)
    # session.commit()
    # 多条插入
    # session.add_all([
    #     User(name='world', age=20),
    #     User(name='python', age=28),
    #     User(name='PHP', age=34)
    # ])
    # session.commit()

    # 查询
    # 查询所有的数据,返回一个存放对象的列表
    # res = session.query(User).all()
    # for x in res:
    #     print(x.name,x.age)
    # 通过主键值查询一条数据,返回一个对象
    # res=session.query(User).get(10)
    # print(res.name,res.age)
    # 条件查询,返回的是一个存放对象的列表
    # res = session.query(User).filter_by(name='python').all()
    # for x in res:
    #     print(x.name,x.age)

    # 修改
    # res=session.query(User).get(1)
    # res.name='hhh'
    # session.commit()

    # 删除
    res = session.query(User).get(1)
    session.delete(res)
    session.commit()
添加
单行插入
user=User(name='hello',age=16)
session.add(user)
session.commit()

pymysql 千万级数据快速 insert 到数据库_sqlalchemy_03

多行插入
session.add_all([
    User(name='world', age=20),
    User(name='python', age=28),
    User(name='PHP', age=34)
])
session.commit()

pymysql 千万级数据快速 insert 到数据库_python_04

查询

查询中的all(),还可以为first(),取符合条件的第一条数据。结果会从原来的存放对象的列表,变为一个单独的对象。

pymysql 千万级数据快速 insert 到数据库_ORM_05


pymysql 千万级数据快速 insert 到数据库_ORM_06


pymysql 千万级数据快速 insert 到数据库_pymysql_07


pymysql 千万级数据快速 insert 到数据库_sqlalchemy_08

修改
res=session.query(User).get(1)
res.name='hhh'
session.commit()

pymysql 千万级数据快速 insert 到数据库_python_09

删除
res = session.query(User).get(1)
session.delete(res)
session.commit()

pymysql 千万级数据快速 insert 到数据库_python_10

三、区别

pymysql 千万级数据快速 insert 到数据库_python_11


pymysql 千万级数据快速 insert 到数据库_sqlalchemy_12