Sqlit3数据库的详细讲解及一些在python中的小技巧

版权声明:共同努力,有不足的地方欢迎大家点出 https://blog.csdn.net/qq_42897012/article/details/84190943

数据库的基本概念。

  1. 库 schema:好像整个表格文档。好像一个物流公司共占地100亩,盖了50个仓库,A01仓库负责存储河南客户货物,A02仓库负责存储广州xx项目物料。每一个仓库对应一个项目。
  2. 表 table:对应Excel表格里sheet1 sheet2。由行内内容和列组成。表描述一个类,每一行描述一个对象。
  3. 字段 field:对应表格头部的 序号、班级、姓名。好像类的属性。
  4. 值 value:表格每一行具体存储的信息。
  5. 主键 primary key:类似表格中 序号 这一列。数据库中这一列会自增并不会重复。
  6. 外键 foreign key:表1里一个字段引用另一个表的行。有点易于维护,保持数据一致性。

字段类型 field type

数据库创建表示要事先告诉计算机硬盘,每张表的每个字段存什么类型、将要存储的内容大还是小。长度过小,内容值存不进去,长度太大,浪费硬盘空间。我们需要选择合适的类型和长度。
各数据库字段类型关键字基本一致。mysql oracle postgresql常用字段类型如下:

  1. 整数
    整数:常用INT INTEGER 占4个字节,2**32,可以表示常用范围整数。
    (不常用)TINYINT(1字节) SMALLINT(2字节) MEDIUMINT(3字节)
    BIGINT(8字节) 适用身份证号、VIP号码比较长的编号。
  2. 浮点数
    常用 FLOAT(4字节) 单精度小数 。 即使是单精度,范围也不小。
    DOUBLE(8字节) 双精度小数。
    场景 金钱计算,轨道计算。
  3. 字符串
    CHAR char(10) 可以存储长度(字节长度)不超过10的字符串。例如"hello"。但由于长度按照字节判断,存unicode编码的中文只能存3个。
    常用 VARCHAR 0-65535字节,variable char 可变字符串。VARCHAR(5) 可以存储5个中文或5个英文字母。场景 用户名、家庭住址。
    TEXT TINYTEXT medium longtext , 场景 大文本存储,书籍文章、用户反馈。
    BLOB medium longblob ,二进制文件, 场景 图片、视频。但一般不在数据库中存储图片和视频,因为会增加数据库的计算压力和带宽传输压力和备份还原的难度和用户信息静态资源耦合到一起,解决方案是 图片视频存到普通文件目录下,数据库中存储文件路径。
  4. 日期
    DATE 日期, 形如"2018-11-08"
    常用 DATETIME 日期时间, “2018-11-08 16:52:30” “2018-11-08 16:52:30.123” “2018-11-08 16:52:30 GTM+8”
    常用 TIMESTAMP 时间戳, 1541667270 1541667270.7252207 1541667270725
  5. sqlite的字段比较简化:
    INTEGER 整数
    REAL 浮点数
    TEXT 字符串
    NULL 什么都不存

数据库的在python中的简单应用

sqlite 比较轻是python的内置库 我们要使用只需要安装一个驱动叫做JDBC就行具体步骤如下:

   1. pycharm左下角图标调出工具栏,打开pycharm右侧Database工具。
   2. 点加号-DataSource数据源-sqlite  。
   3. 弹出的对话框选择 drivers-sqlite(Xerial)  
   4. 点击download sqlite-jdbc[latest]  
   5. 如果网速不好的话 下载sqlite-jdbc-3.20.1.jar 。对话框+-custom jars 从本地安装
   6. 驱动安装成功后点击apply应用
   7. 点击对话框 project data source ,开始配置连接数据库的实例
   8. File路径点击 ...图标,选择要连接的.db文件。
   9. 点test connection, seccessful为成功
   10. 点击ok退出。看到连接的数据库实例下有表`

database 工具使用

展开目录,找到 表。
schemas 模型,理解为大的仓库,默认有一个仓库main,main仓库下是我们建的表。
sqlite_masters是数据库系统内置表,不用关注它,不能删除。
不用关注collations文件夹。
双击表查看表数据。
图形化界面 加减号增加修改数据,注意修改完需要submit提交。
点击console图标,打开sql命令行工具,可以在里面写sql语句,点击execute按钮执行,得到结果集。
选中库,右键new-table,可视化界面创建表。
实例右键 database-tools - manage shown schema  
工具会自动提交。

SQL查询语句

介绍: structured query language 结构化查询语言。专门对数据库进行查找、增加、修改、删除、统计的操作语言。
CURD 增删查改 create update retrieve delete。
书写风格,关键字大小写都行,建议大写。表名大小写都行,但是在一些数据库中不区分大小写,建议小写。

(重要)基本语法。


1. 查找
SELECT 字段1,字段2,字段3,...  FROM 表名;      python中返回值形如[(1, 502, 小明,), (), ()]。
字段比较多时简写为  SELECT * FROM 表名;       由于数据库执行时会把*转换为字段再执行,性能极微小下降。
SELECT * FROM 表名 WHERE 字段1 = 过滤值,字典2=过滤值 ;       where限定条件查找。
2. 添加 
INSERT 字段1,字段2,... INTO 表名 VALUES (1, "小明", "男");
简写 INSERT INTO 表名 VALUES (1, "小明", "男");
3. 修改
UPDATE 表名 SET 字段1=新值,字段2=新值 WHERE 字段1 = 过滤值;
注意没有where条件限定行的话将会更新整张表。
4. 删除
DELETE FROM 表名;                 注意会删除整张表。
DELETE FROM 表名 WHERE 字段1 = 过滤值;       限定条件删除某些行。
# 假性删除,为了防止数据误删和方便找回。专门新建一个标识字段来表示用户状态(正常、注销)
cursor.execute("""
    UPDATE employee set address=1 where id>4 ;
""")


5. 创建表
CREATE TABLE 表名 {
    字段类型 字段名 其它关键字(主键 备注),
    INT   id   PRIMARY KEY,
    VARCHAR(20) username ,
}

代码实例

创建表,插入数据

# sqlite 创建表,插入数据
import sqlite3
connect = sqlite3.connect("testsqlite.db")  # 连接数据库
cursor = connect.cursor()  # 打开游标
cursor.execute("""CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(10)); """)  # 创建表
cursor.execute("""
    INSERT INTO student (id, name) VALUES (4, "明");
""")  # 插入数据
cursor.close()  # 关闭游标 可以省略
connect.commit()  # 提交事务
connect.close()  # 关闭数据库连接

"""
(了解)数据库驱动:数据库有自己本身的软件构造和操作语言,数据库暴露出操作接口,方便跟其它各种编程语言对接。编程语言到数据库的对接中介 叫驱动。所以我们用python操作数据库要使用驱动。
步骤:
1. 引入驱动包
2. 连接数据库,得到会话。   中大型数据库需要先用户名、密码验证,再创建数据库,再连接数据库;而轻量级的sqlite省略了前面的过程直接连接,如果这个数据库不存在的话,会新生成一个库,数据保存在一个单db文件中。
3. 生成游标。  游标:游标是对数据库某一行某一格进行增删改查的操作者,就好像操作excel表格时的鼠标。
4. 执行SQL语句,cursor,execute()执行语句,参数是字符SQL语句。
5. 执行完成后关闭游标。   这一步可以省略。
6. 提交 commit。   除了查询,增加、修改、删除操作都需要在执行sql提交,否则不生效,好像平时用软件保存时的确认对话框。
7. 断开会话连接,释放资源。
"""

"""
可能的异常:
1. 唯一约束错误,主键重复。 sqlite3.IntegrityError: UNIQUE constraint failed: student.id
2. 表已存在重复创建。sqlite3.OperationalError: table student already exists
"""

查询 修改 删除

# sqlite  查询 修改 删除
import sqlite3
connect = sqlite3.connect("testsqlite.db")
cursor = connect.cursor()
cursor.execute("""
    SELECT id,name from student;
""")
student_list = cursor.fetchall()
print(student_list)

cursor.execute("""
    SELECT * FROM student WHERE name="小明"; 
""")
student = cursor.fetchone()
print(student)

cursor.execute("""
    SELECT * FROM student WHERE id=0;
""")
student2 = cursor.fetchone()
print(student2)

cursor.execute("""
    SELECT * FROM student WHERE id>0;
""")
# student_list3 = cursor.fetchall()
student3 = cursor.fetchone()
# print(student_list3)
print(f'学生姓名是 {student3[1]}')
# print('学生姓名是{} 性别{} 住址{} 电话{}'.format(student3['name'], student3[2], ))

cursor.execute("""
    UPDATE student SET name="大红" WHERE id=3;
""")
connect.commit()
cursor.execute(""" select * from student; """)
print(cursor.fetchall())

cursor.close()
connect.close()

"""
cursor 取数据
cursor.fetchall()  取回结果集,形如[(1, '小王'), (2, '小明')] 大列表,列表每一项是元组、是一行,元组里的每一项对应每一列的值。结果空返回[]。
cursor.fetchone()  取回一条数据,形如 (2, '小明') 。结果空返回None类型。如果select符合多条,返回多条结果里的第一条。
cursor.fetchxxx() 方法为了节省内存和速度采用了生成器结构,只能取一次。
"""
"""
sql基础语法补充:
1. 一张表一般都有一列主键,主键primary key一般名叫 id,字段类型一般为自增整数。当insert行内容时,sql语句可以不插入id列,数据库会帮你自动插入并自增auto increase。
主键不能重复。主键好处是确保数据一致性、方便查询。
2.如果工作中一个数据库连接实例下有多个库,那么表名要带上命名空间,例如main.student。
3.丢弃表 drop。跟delete关键字相比更为严重,delete删除某行或清空表内容 表结构还在。而drop是完全删除丢弃整个表,内容和结构都删除。 drop table [表名]。
4.字段被双引号括住 ,形如SELECT "id", "name" FROM student; ,结果一样。好处是避免数据库关键字导致的错误。当数据库解释器遇到引号时,会认为引号里的名字就是用户自定义的字段名而不是内置关键字。平时省事可以不加引号。

"""

关于 cursor.fetchall() 方法返回值为字典形式

点击 传送门 传送。

猜你喜欢

转载自blog.csdn.net/qq_42897012/article/details/84190943