使用Python操作MySQL数据库

时间:2021-10-12 02:49:29

使用Python操作MySQL数据库

一、安装PyMySQL的安装

pip install pymysql

二、连接数据库步骤

  • pymysql连接数据库的必要参数:主机、端口、用户名、密码、数据库
  • 注:pymysql不能提供创建数据库的服务,数据库要提前创建
import pymysql
# 1)建立数据库连接对象 conn
conn = pymysql.connect(user='root', passwd='root', database='db')
# conn = pymysql.connect(user='root', passwd='root', database='db', autocommit=True)

# 2)通过 conn 创建操作sql的 游标对象
# 注:游标不设置参数,查询的结果就是数据元组,数据没有标识性
# 设置pymysql.cursors.DictCursor,查询的结果是字典,key是表的字段

cursor = conn.cursor(pymysql.cursors.DictCursor)

# 3)编写sql交给 cursor 执行
sql='create, select, insert, update, delete.....'

# 4)如果是查询,通过 cursor对象 获取结果
cursor.execute(sql)

# 5)操作完毕,端口操作与连接断开连接

cursor.close()
conn.close()

三、创建表

import pymysql

# 1.建立数据连接对象 conn

conn = pymysql.connect(user='root', password='root', database='db1')

# 2 通过conn创建sql的游标对象
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 3.编写sql语句

sql = 'create table test(id int, x int, y int)'

# 4.执行sql语句

cursor.execute(sql)

# 5.关闭
cursor.close()
conn.close()

四、插入数据

import pymysql

# 1.建立数据连接对象 conn

conn = pymysql.connect(user='root', password='root', database='db1')

# 2 通过conn创建sql的游标对象
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 3.编写sql语句

# 增加一条数据
# sql= 'insert into test1 values(1, 11,22)'

# 通过参数插入
sql = 'insert into test1 values(%s,%s,%s)'

# 4.执行sql语句

# 增加一条数据
# row = cursor.execute(sql, (1, 2, 100))

# 增加多条数据
row = cursor.executemany(sql, [(2, 22, 22), (3, 33, 22)])

# 5.提交sql

## 在创建conn对象时,不设置autocommit,默认开启事务,增删改操作不会直接映射到数据库中,
# 需要执行 conn.commit() 动作
conn.commit()
if row:
    print("插入成功")
# 5.关闭
cursor.close()
conn.close()

五、删除数据

import pymysql
"""
@author RansySun
@create 2019-09-27-11:45
"""

conn = pymysql.connect(user='root', password='root', database='db1')

curson = conn.cursor(pymysql.cursors.DictCursor)

sql = 'delete from test1 where id=5'

row = curson.execute(sql)

conn.commit()

if row:
    print("删除成功")

   
cursor.close()
conn.close()

六、修改数据

import pymysql
"""
@author RansySun
@create 2019-09-27-11:48
"""

# 创建连接对象
conn = pymysql.connect(user='root', password='root', database='db1')

# 创建游标
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 编写sql语句
sql = 'update test1 set x=%s where id=2'

# 执行sql语句
row = cursor.execute(sql, 10000)

# 提交sql语句
conn.commit()

if row:
    print('修改成功')

cursor.close()
conn.close()

七、查询数据

Python查询Mysql使用 fetchone() 方法获取单条数据,使用

  • fetchall():方法获取多条数据。
  • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
  • fetchall(): 接收全部的返回结果行.
  • rowcount(): 这是一个只读属性,并返回执行execute()方法后影响的行数。
import pymysql

"""
@author RansySun
@create 2019-09-27-11:48
"""
# 1.建立数据连接对象 conn

conn = pymysql.connect(user='root', password='root', database='db1')

# 2 通过conn创建sql的游标对象
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 3.编写sql语句 查询语句
sql = 'select * from test1'

# 4.执行sql语句
try:
    row = cursor.execute(sql)
    print('row', row)

    # 1获取全部记录
    # res = cursor.fetchall()
    # for row in res:
    #     print(row)

    # 2获取一条记录
    res = cursor.fetchone()
    print(res)

    # 3.获取指定条数
    res = cursor.fetchmany(3)
    print(res)

except:
    conn.rollback()

# 5.关闭
cursor.close()
conn.close()

八、游标操作

import pymysql

"""
@author RansySun
@create 2019-09-27-12:07
"""
# 1.建立数据连接对象 conn

conn = pymysql.connect(user='root', password='root', database='db1')

# 2 通过conn创建sql的游标对象
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 3.编写sql语句

sql = 'select * from test1'

# 4.如果是查询,通过 cursor对象 获取结果
try:
    cursor.execute(sql)

    # absolute绝对偏移,游标重置,从头(0)开始偏移
    # cursor.scroll(3, 'absolute')
    # r2 = cursor.fetchone(5)
    # print(r2)

    # relative相对偏移,游标在当前位置进行左右偏移
    cursor.scroll(2, 'relative')
    res = cursor.fetchmany(1)
    print(res)

except:
    conn.rollback()

cursor.close()
conn.close()

九、pymysql事务

import pymysql

"""
@author RansySun
@create 2019-09-27-12:15
"""

# 1.建立数据连接对象 conn

conn = pymysql.connect(user='root', password='root', database='db1')

# 2 通过conn创建sql的游标对象
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 3.编写sql语句
crete_sql = 'create table t3(id int, name char(4), money int)'
try:

    row = cursor.execute(crete_sql)
    print(row)
except:
    print('表已创建')
    pass

# 空表才插入

# 空表才插入
row = cursor.execute('select * from t3')
if not row:
    inert_sql = 'insert into t3 values(%s,%s,%s)'
    row = cursor.executemany(inert_sql, [(1, 'tom', 10), (2, 'Bob', 10)])
    conn.commit()

"""
try:
    sql1 = 'update t3 set money=money-1 where name="tom"'
    cursor.execute(sql1)
    sql2 = 'update t3 set money=money 1 where name="ob"'
    cursor.execute(sql2)
except:
    print('转账执行异常')
    conn.rollback()
else:
    print('转账成功')
    conn.commit()
"""

try:
    sql1 = 'update t3 set money=money-1 where name="tom"'
    r1 = cursor.execute(sql1)
    sql2 = 'update t3 set money=money 1 where name="laowang"'  # 转入的人不存在
    r2 = cursor.execute(sql2)
except:
    print('转账执行异常')
    conn.rollback()
else:

    if r1 and r2:
        print('转账成功')
        conn.commit()
    else:
        print("转账失败")
        conn.rollback()

十、sql防注入

import pymysql
from pymysql.cursors import DictCursor
conn = pymysql.connect(user='root', passwd='root', db='oldboy')
cursor = conn.cursor(DictCursor)

try:
    sql = 'create table user(id int, name char(4), password char(6))'
    row = cursor.execute(sql)
    print(row)
except:
    print('表已创建')
    pass

# 空表才插入
row = cursor.execute('select * from user')
if not row:
    sql = 'insert into user values(%s,%s,%s)'
    row = cursor.executemany(sql, [(1, 'tom', '123'), (2, 'bob', 'abc')])
    conn.commit()



# 用户登录
usr = input('usr: ')
pwd = input('pwd: ')

# 自己拼接参数一定有sql注入,将数据的占位填充交给pymysql

"""
sql = 'select * from user where name="%s" and password="%s"' % (usr, pwd)
row = cursor.execute(sql)
if row:
    print('登录成功')
else:
    print('登录失败')
"""
sql = 'select * from user where name=%s and password=%s'
row = cursor.execute(sql, (usr, pwd))
if row:
    print('登录成功')
else:
    print('登录失败')


# 知道用户名时
# 输入用户时:
#   tom => select * from user where name="tom" and password="%s"
#   tom" # => select * from user where name="tom" #" and password="%s"

# 不自定义用户名时
#   " or 1=1 # => select * from user where name="" or 1=1 #" and password="%s"

十一、索引

索引就是 键 - key

1)键 是添加给数据库表的 字段
2)给表创建 键 后,该表不仅会形参 表结构、表数据,还有 键的B 结构图
3)键的结构图是需要维护的,在数据完成增、删、改操作时,只要影响到有键的字段,结构图都要维护一次, 所以创建键后一定会降低 增、删、改 的效率
4)键可以极大的加快查询速度(开发需求中,几乎业务都和查有关系)
5)建立键的方式:主键、外键、唯一键、index

import pymysql
from pymysql.cursors import DictCursor

conn = pymysql.connect(user='root', passwd='root', db='db1')
cursor = conn.cursor(DictCursor)
# 创建两张表

sql1 = """create table a1(
    id int primary key auto_increment,
    x int,
    y int
)"""

cursor.execute(sql1)

sql2 = """create table a2(
    id int primary key auto_increment,
    x int,
    y int,
    index(x)
)"""

cursor.execute(sql2)

# 每个表插入5000条数据
import random

for i in range(1, 5001):
    x = i
    y = random.randint(1, 5000)
    cursor.execute('insert into a1(x, y) values(%s, %s)', (x, y))
    cursor.execute('insert into a2(x, y) values(%s, %s)', (x, y))
    conn.commit()
    
    
import time

# a1的x、a1的id、a2的x

# a1的id时间
b_time = time.time()
sql = 'select * from a1 where id=4975'
cursor.execute(sql)
e_time = time.time()
print(e_time - b_time)


# a1 的x时间
b_time = time.time()
sql = 'select * from a1 where x=4975'
cursor.execute(sql)
e_time = time.time()
print(e_time - b_time)


# a2时间
b_time = time.time()
sql = 'select * from a2 where x=4975'
cursor.execute(sql)
e_time = time.time()
print(e_time - b_time)