python 数据库操作

pycharm创建mysql表 pycharm中新建一个数据库
在这里插入图片描述

链接并创建数据库

from pymysql import *

# 创建数据库实例
# 1、创建数据库链接
conn = connect(host="127.0.0.1", port=3306,user="root",password="darly")

# 2、获取游标对象
mycur = conn.cursor()
#  执行创建数据库实力,并返回int类型结果,1表示添加成功,如果数据库实例已经存在抛出异常
try:
    result = mycur.execute("create database mydb charset utf8")
    print("添加数据库实例后返回的结果:",result)
# except ProgrammingError as msg:
except Exception as msg:
    print("添加数据库实例出现异常:",msg)
finally:
    #4 关闭游标
    mycur.close()
    # 5、关闭链接
    conn.close()

链接指定的数据库,并创建表

链接数据库需要 主机地址,端口号,账号,密码,数据库名称

import pymysql
#数据库链接
db = pymysql.Connect(host="localhost",port=3306,user='daryl',passwd='******',db='quality_job')

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

#定义sql语句
sql = """create table student(id int not null, name varchar(20),age int)"""
# 执行sql语句
cursor.execute(sql)

# 关闭数据库
db.close()

实例2

from pymysql import *

# 链接到mydb数据库,并创建一个表
conn = connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="darly",
    database="mydb",
    charset="utf8"
)

mycur = conn.cursor()

# 执行创建数据库的表tb_user,返回int类型的结果,成功添加表的话,返回0
try:
    result = mycur.execute("""
        CREATE TABLE user(
            id int(11) NOT NULL AUTO_INCREMENT,
            name varchar(255) COLLATE utf8_bin NOT NULL,
            password varchar(255) COLLATE utf8_bin NOT NULL,
            PRIMARY KEY(id)           
        )ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1
     
    """)
#     COLLATE  指定字符集
except (IntegrityError,ProgrammingError) as msg:
    print("表添加出现异常,异常信息:%s" % msg)
finally:
    # 4 关闭游标
    mycur.close()
    # 5、关闭链接
    conn.close()

插入数据

MySQLdb提供了两个执行语句的方法:execute(),executemany()

1、execute(),可接受一条语句从而执行


#数据库链接
db = pymysql.Connect(host="localhost",port=3306,user='daryl',passwd='******',db='quality_job')
# 创建一个游标对象 cursor()
cursor = db.cursor()
#定义sql语句
sql = """insert into student(id,name,age) values(1,"张三",12)"""
cursor.execute(sql)
db.commit()     # 提交执行
# 关闭数据库
db.close()

2、executemany() 能同时执行多条语句,执行同样多的语解码器可比execute()快得多,强烈建议执行多条语句时使用executemany,使用格式:
executemany(templet,args)
templet:sql模板字符串, 例如: ‘insert into table(id,name) values(%s,%s)’
args:模板字符串中的参数,是一个列表,列表中的每一个元素必须是元组!!! 例如:[(1,‘小明’),(2,‘小红’),(3,‘琦琦’),(4,‘韩梅梅’)]

import pymysql
#数据库链接
db = pymysql.Connect(host="localhost",port=3306,user='daryl',passwd='807612',db='quality_job')
# 创建一个游标对象 cursor()
cursor = db.cursor()
#定义sql语句
sql = """insert into student(id,name,age) values(%s,%s,%s)"""    # 注意数据库中id和age数据类型是int类型,如果格式化直接用%d,程序会报错,用%s可以执行(虽然数据库中类型仍然是Int类型)
params = [("3", "username", "23"), ("4", "password", "24"),("5", "useraccount", "25"),("5", "myaccount", "25")]

cursor.executemany(sql,params)
db.commit()     # 提交执行
# 关闭数据库
db.close()

在这里插入图片描述
Python MySQLdb默认关闭autocommit带来的坑

begin 显示的开启事务,会禁用autocommit;

from pymysql import *

# 链接到mydb数据库,并创建一个表
conn = connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="darly",
    database="mydb",
    autocommit=True  # 此属性设置后,相关新增、修改、删除等数据库信息变化的语句会自动提交
)

mycur = conn.cursor()
# 注意开启事务后不能与自动提交同时使用
try:
    # 开启事务
    # conn.begin()
    # 新增数据sql语句
    sql = """insert into user(name,password) values(%s,%s)"""
    # 新增数据值
    params = [("l1","123"),("l2","123")]
    mycur.executemany(sql,params)
    # 链接字符串中属性autocommit = True,就不用再次提交了。否则必须有此语句
    # conn.commit()  #新增,删除数据等需要执行此语句,否则不会执行邢增删除等修改
except Exception as msg:
    print("新增数据异常,异常信息",msg)
    # 回滚事务
    # conn.rollback()
finally:
    mycur.close()
    conn.close()

查询数据

import pymysql

#数据库链接
db = pymysql.Connect(host="localhost",port=3306,user='daryl',passwd='******',db='quality_job')
# 创建一个游标对象 cursor()
cursor = db.cursor()
#定义sql语句
sql = "select * from student where id=1"
cursor.execute(sql)
data1 = cursor.fetchone()  #获取单个对象(一行数据)
print(data1)
print(data1[1])
sql = "select * from student"
cursor.execute(sql)
data2 = cursor.fetchall()    # 获取多个数据(多行数据)
print(data2)
# 关闭数据库
db.close()

在这里插入图片描述
在这里插入图片描述

from pymysql import connect,cursors
import pymysql

# 创建数据库实例
# 1、创建数据库链接
conn = connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="darly",
    database="mydb",
    charset="utf8",
    # cursorclass=cursors.DictCursor   # 此参数用于指定游标返回类型为字典类型,默认时元组类型
)

# 2、获取游标对象
mycur = conn.cursor()

sql = "select * from user"

print("查询到几条数据",mycur.execute(sql)) # 返回的是查询出来的数据行数
"""
注意以下语句不能同时使用,同时使用返回结果不正确,
上面查询语句执行以后,每取出一次,查询结果中就会减少一条数据
例如:上面一共查询到两条数据,fetchone()获取一次后,在游标中去除一条数据
再次fetchall()提取时,仅能提取到一条数据了。
最后用fetchmany(2)提取时则为空。
"""

# print("返回第一条数据",mycur.fetchone()) # 返回查询数据中的一条数据
# print("返回查询到的所有数据",mycur.fetchall()) # 返回查询数据中的所有数据,元组嵌套元组
print("返回两条数据",mycur.fetchmany(2)) # 返回查询数据中的指定数量的数据,元组嵌套元组

条件查询

在这里插入图片描述

from pymysql import connect,cursors
import pymysql

# 创建数据库实例
# 1、创建数据库链接
conn = connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="darly",
    database="mydb",
    charset="utf8",
    cursorclass=cursors.DictCursor   # 此参数用于指定游标返回类型为字典类型,默认时元组类型
)

# 2、获取游标对象
mycur = conn.cursor()
# 方式1
sql = "select * from user where id=2"
mycur.execute(sql)
print(mycur.fetchall())

sql2 = "select * from user where id=%s"
mycur.execute(sql2,2)
print(mycur.fetchall())

# 传参按照列表类型传参
sql3 = "select * from user where id>=%s and id<=%s"
mycur.execute(sql3,[1,2])
print(mycur.fetchall())

# 按照字典类型传参
sql4 = "select * from user where id>=%(start)s and id<=%(end)s"
mycur.execute(sql4,{"end":2,"start":1})
print(mycur.fetchall())

sql5 = "select * from user where name like '%e%'"
mycur.execute(sql5)
print(mycur.fetchall())


更新数据库(修改数据)

import pymysql
#数据库链接
db = pymysql.Connect(host="localhost",port=3306,user='daryl',passwd='*******',db='quality_job')
# 创建一个游标对象 cursor()
cursor = db.cursor()
#定义sql语句
sql = "update student set age=age+1 "
cursor.execute(sql)
db.commit()
sql = "update student set age=age+1 where id=1 "
cursor.execute(sql)
db.commit()
# 关闭数据库
db.close()

删除数据

删除数据之delete

import pymysql
#数据库链接
db = pymysql.Connect(host="localhost",port=3306,user='daryl',passwd='********',db='quality_job')
# 创建一个游标对象 cursor()
cursor = db.cursor()
#定义sql语句
sql = "delete from student where id=3"

print(cursor.execute(sql))  # 返回的时受影响的行数,即删除了几条数据
db.commit()
# 关闭数据库
db.close()

删除数据之deletetruncate——清空

删除内容、释放空间但不删除定义,也就是数据表的结构还在。与drop不同的是,它只是清空表数据而已,它比较温柔。

import pymysql
try:
    db = pymysql.Connect(host="localhost", port=3306, user='daryl', passwd='*******', db='quality_job')
    cursor = db.cursor()
    sql = "truncate table job_info"
    cursor.execute(sql)
    db.commit()
except Exception as e:
    print('出现异常:', e)
    db.rollback()
    db.close()

删除数据之deletedrop

删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。

import pymysql
try:
    db = pymysql.Connect(host="localhost", port=3306, user='daryl', passwd='*****', db='quality_job')
    cursor = db.cursor()
    sql = "drop table student"
    cursor.execute(sql)
    db.commit()
except Exception as e:
    print('出现异常:', e)
    db.rollback()
    db.close()

事务和异常处理

事务是一个不可分割的整体,事务中的操作要么都执行,要么都不执行。
当事务中提交的操作中,有一个操作失败,则可以回滚到事务提交前的状态。

import pymysql
#数据库链接
db = pymysql.Connect(host="localhost",port=3306,user='daryl',passwd='*******',db='quality_job')
# 创建一个游标对象 cursor()
cursor = db.cursor()
#定义sql语句
sql1 = """insert into student(id,name,age) values(6,"张三",12)"""
sql2 = "insert into student(id,namme,age) values(7,'张刚',83)"
try:
    cursor.execute(sql1)
    cursor.execute(sql2)
    db.commit()            #提交事务
except Exception as e:
    db.rollback()         #回滚事务
    print("出现异常,异常情况为:",e)

重置ID起始编号

当数据库中将序列号设置为主键,并自动增加后,当删除相关的记录后,序列好仍然以删除前序列号进行编号,如果需要接删除前的序号,您可以进行起始号设置。
仅对后面新增记录有效,对已存在记录无效

import pymysql
try:
    db = pymysql.Connect(host="localhost", port=3306, user='daryl', passwd='********', db='quality_job')
    cursor = db.cursor()
    sql = "alter table job_info auto_increment = 1"  # 后面的值是,新增数据从此值开始新增,且此值应大于现有数据库中的id最大值,否则在最大值上加1
    cursor.execute(sql)
    db.commit()
except Exception as e:
    print('出现异常:', e)
    db.rollback()
    db.close()

获取数据库中记录数量

import pymysql
db = pymysql.Connect(host="localhost", port=3306, user='daryl', passwd='******', db='quality_job')
cursor = db.cursor()
cursor.execute("""SELECT COUNT(*) FROM job_info""")
print(cursor.fetchone()[0])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值