最最最最常用的增删改查语句
1. create table 表名(
属性1 数据类型 约束,
属性2 数据类型 约数,
...
)
2. insert into 表名(属性1,属性2...) values(值1,值2...)
3. delete from 表名 where 条件
4. update 表名 set 属性1=值1,属性2=值2... where 条件
5. select 属性1,属性2... from 表明 where 条件
操作SQLite3数据库
1. 从Python3.x版本开始,再标准库中已经内置了SQLite3模块,它可以支持SQLite3数据库的访问和相关的数据库操作.
(1) Python语言使用SQLite3数据库只要导入SQLite3模块即可
2. Python语言操作SQLite3数据库的基本流程如下:
(1) 导入相关库或模块( import sqlite3)
(2) 使用connect()链接数据库并获取数据库连接对象. 它提供了一下方法:
1) cursor() 创建一个游标对象
2) commit() 处理事务提交
3) rollback() 处理事务回滚
4) close() 关闭一个数据库连接
(3) 使用con.cursor()获取游标对象
(4) 使用游标对象的方法(execute(),executemany(),fetchall()等)来操作数据库,实现插入,修改和删除操作,并查询获取显示相关的记录.
(5) 在Python程序中,连接函数sqlite3.connect()有两个常用参数:
1) database: 表示要访问的数据库名 (数据库地址)
2) timeout: 表示访问数据的超时设定
(6) 使用close()关闭游标对象和数据库连接. 数据库操作完成之后,必须及时调用其close()方法关闭数据库连接,这样做的目的是减轻数据库服务器的压力.
3. 数据库知识补充, 增删改操作如果没有异常则提交事务,如果有异常则进行事务的回滚. 查询则不用进行事务的操作.
使用SQLite3创建表
# code01_操作sqlite创建表.py
"""
1. 导入sqlite3模块
2. 创建连接 sqlite3.connect(数据库路径,超时时间)
3. 创建游标对象
4. 编写创建表的sql语句
5. 执行sql语句
6. 关闭游标,关闭连接
"""
import os
import os.path
import sqlite3
def main():
db_path = os.path.abspath(r"./DB/code01.db")
con = sqlite3.connect(db_path) # 这里创建连接,返回一个连接对象
cur = con.cursor()
sql = """ create table t_person(
pno integer primary key autoincrement,
pname varchar not null ,
age integer
)
""" # 使用文档字符串可以直接输入文本
try:
cur.execute(sql)
print("创建表成功")
except BaseException as e:
print(e)
print("创建表失败")
finally:
# 1. 关闭游标 2. 关闭连接
cur.close()
con.close()
if __name__ == "__main__":
main()
使用SQLite插入数据
调用游标对象的execute(sql,(值))执行插入sql
使用 executemany(sql,[(值1),(值2)...])执行多条sql语句
使用executemany()比循环使用excute()执行多条sql语句效率高
# code02_操作sqlite3向数据库插入一条数据.py
import sqlite3
import os
def main():
try:
db_path = os.path.abspath(r"./DB/code01.db")
con = sqlite3.connect(db_path)
cur = con.cursor()
# 1. 自增长的字段是不需要插入数据的
# 2. 这里的字段值使用 ? 来占位
sql = """ insert into t_person(pname,age) values(?,?)
"""
para = ("张三", 24)
cur.execute(sql, para) # 插入第一条数据
cur.execute(sql, ("李四", 24))
con.commit() # 如果插入没有没有问题就进行事务的提交
print("插入数据成功")
except BaseException as e:
print(e)
print("插入数据失败")
con.rollback() # 如果插入失败,要进行事务回滚
finally:
cur.close()
cur.close()
if __name__ == "__main__":
main()
# code03_操作sqlite3向数据库插入多条数据.py
import os
import sqlite3
def main():
db_path = os.path.abspath(r"./DB/code01.db")
try:
con = sqlite3.connect(db_path)
cur = con.cursor()
sql = """ insert into t_person(pname,age) values(?,?)
"""
# 执行多次语句 cur.excutemany(sql,[(值1),(值2)...])
cur.executemany(sql, [("刘一", 21), ("陈二", 22), ("王五", 25), ("赵六", 26), ("孙七", 27), ])
con.commit() # 插入没有异常则进行事务的提交
print("插入数据成功")
except BaseException as e:
print(e)
print("插入数据失败")
con.rollback() # 数据插入失败要进行事务回滚
finally:
cur.close()
con.close()
if __name__ == "__main__":
main()
使用SQLite3查询数据
查询数据,游标对象提供了 fetchall() 和 fetchone()
fetchall() 获取所有数据,返回一个列表.
fetchone() 获取其中其中一个结果,返回一个元组
# code04_操作sqlite3查询所有数据.py
import os
import sqlite3
def main():
db_path = os.path.abspath(r"./DB/code01.db")
try:
con = sqlite3.connect(db_path)
cur = con.cursor()
sql = """ select * from t_person
"""
cur.execute(sql) # 执行查询语句
# 增删改查,只有查询是不需要提交事务的
person_all = cur.fetchall() # 获取结果集(返回的是元组)
# print(person_all)
for person in person_all:
print(person)
except Exception as e:
print(e)
print("查询失败")
finally:
cur.close()
con.close()
if __name__ == "__main__":
main()
# code05_操作sqlite3查询一条数据.py
import os
import sqlite3
def main():
db_path = os.path.abspath(r"./DB/code01.db")
try:
con = sqlite3.connect(db_path)
cur = con.cursor()
sql = """ select * from t_person
"""
cur.execute(sql)
person = cur.fetchone() # 只获取一条数据
print(person)
except Exception as e:
print(e)
print("查询失败")
finally:
cur.close()
con.close()
if __name__ == "__main__":
main()
使用sqlite3修改数据
# code06_操作sqlite3修改数据.py
import os
import sqlite3
def main():
db_path = os.path.abspath(r"./DB/code01.db")
try:
con = sqlite3.connect(db_path)
cur = con.cursor()
sql = """ update t_person set pname=? where pno=?
"""
cur.execute(sql, ("张三三", 1))
con.commit()
# 查询验证结果
cur.execute("select * from t_person where pno=?", (1,))
person = cur.fetchone()
print(person)
except Exception as e:
print(e)
print("修改数据失败")
con.rollback()
finally:
cur.close()
con.close()
if __name__ == "__main__":
main()
使用sqlite3删除数据
# code07_操作sqlite3删除数据.py
import os
import sqlite3
def main():
db_path = os.path.abspath(r"./DB/code01.db")
try:
con = sqlite3.connect(db_path)
cur = con.cursor()
cur.execute("delete from t_person where pno=?", (1,))
con.commit()
print("删除成功")
except Exception as e:
print(e)
print("删除失败")
con.rollback()
finally:
cur.close()
con.close()
if __name__ == "__main__":
main()
下载安装MySQL
手动配置MySQL非常麻烦...
推荐使用可视化的集成环境 PHPStudy, XMAPP (不要花费一堆时间在配置环境上,多花时间在业务上)
操作MySQL数据库
搭建pymysql环境
1. 在使用pymysql之前,我们需要确保pymysql已安装. 如果还未安装,我们可以使用一下命令安装最新版的pymysql
pip install pymysql
2. 如果无法在线安装,进入python官网 www.python.org, 点击PyPI, 下载 xxx.whl, 然后本地使用pip进行安装
pip install xxx.whl
参数化
1. sql语句的参数化,可以有效防止sql注入
2. 注意: 此处不同于Python的字符串格式化,全部使用%s占位(sqlite3中使用的是?占位)
创建数据库表
# code08_操作mysql创建数据表.py
# 导入相应数据库模块
import pymysql
def main():
# sqlite3 是python3内置的,直接新建一个 xxx.db 就是一个数据库
# sqlite3.connect(数据库地址)
# 相对来说mysql就要正式很多了
# (*args,**kwargs) (host=None, user=None, password="",database=None, port=0)
try:
con = pymysql.connect("localhost", "root", "root", "python_db", 3306)
# 理解函数的可变参数,一定要按顺序传递 arg *args **kwargs
# con = pymysql.connect("localhost", user="root", password="root", database="python_db", port=3306)
cur = con.cursor() # 创建游标对象
sql = """ create table t_student(
sno int primary key auto_increment,
sname varchar(30) not null,
age int(2),
score float(3,1)
)
"""
cur.execute(sql)
except BaseException as e:
print(e)
print("数据表创建失败")
finally:
cur.close()
con.close()
if __name__ == "__main__":
main()
数据库插入操作
其实mysql和sqlite在python中的操作基本一致
需要注意(1)不同数据库的数据类型不同 (2) 参数化一个是 ? 一个是 %s
这里以插入为例子,后面不再赘述
# code09_操作mysql插入数据.py
import pymysql
def main():
try:
con = pymysql.connect(host="localhost", user="root", password="root", port=3306, database="python_db")
cur = con.cursor()
insert_sql = """ insert into t_student(sname,age,score) values(%s,%s,%s)
"""
para = [("刘一", 21, 98.5), ("陈二", 22, 96.0), ("张三", 23, 95.9), ("李四", 24, 93.5), ("王五", 25, 97.2)]
cur.executemany(insert_sql, para) # 注意execute() 和 executemany()
con.commit()
print("插入数据成功")
except Exception as e:
print(e)
print("插入数据失败")
con.rollback() # 增删改如果是要都要进行回滚
finally:
cur.close()
con.close()
if __name__ == "__main__":
main()