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带来的坑
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])