{"id":22407635,"url":"https://github.com/xavierjiezou/python-sqlite3-tutorial","last_synced_at":"2026-05-02T05:04:50.255Z","repository":{"id":108193426,"uuid":"483905181","full_name":"XavierJiezou/Python-Sqlite3-Tutorial","owner":"XavierJiezou","description":"Tutorial for splite3 module based on Python.","archived":false,"fork":false,"pushed_at":"2022-04-21T04:33:15.000Z","size":97,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-25T11:01:59.702Z","etag":null,"topics":["python","sqlite"],"latest_commit_sha":null,"homepage":"https://XavierJiezou.github.io/Python-Sqlite3-Tutorial","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/XavierJiezou.png","metadata":{"files":{"readme":"README.ipynb","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-21T04:28:32.000Z","updated_at":"2022-04-21T04:33:19.000Z","dependencies_parsed_at":"2023-06-14T05:00:47.020Z","dependency_job_id":null,"html_url":"https://github.com/XavierJiezou/Python-Sqlite3-Tutorial","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/XavierJiezou/Python-Sqlite3-Tutorial","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XavierJiezou%2FPython-Sqlite3-Tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XavierJiezou%2FPython-Sqlite3-Tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XavierJiezou%2FPython-Sqlite3-Tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XavierJiezou%2FPython-Sqlite3-Tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/XavierJiezou","download_url":"https://codeload.github.com/XavierJiezou/Python-Sqlite3-Tutorial/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XavierJiezou%2FPython-Sqlite3-Tutorial/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262180947,"owners_count":23271313,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python","sqlite"],"created_at":"2024-12-05T11:14:56.845Z","updated_at":"2026-05-02T05:04:50.183Z","avatar_url":"https://github.com/XavierJiezou.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Python-Sqlite3-Tutorial\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 引言\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"SQLite 是一个由 C 语言编写的库，它提供了一个轻量级的基于磁盘的数据库，不需要单独开一个数据库服务器，并允许使用 SQL 语句访问数据库。\\n\",\n    \"\\n\",\n    \"判断是否使用 SQLite 的标准：\\n\",\n    \"\\n\",\n    \"- 数据与应用分离：不适用 SQLite\\n\",\n    \"- 要求高并发性：不适用 SQLite\\n\",\n    \"- 大数据：不适用 SQLite\\n\",\n    \"- 否则，选择 SQLite\\n\",\n    \"\\n\",\n    \"SQLite 不是一个 client/server 架构的数据库引擎（如 MySQL、Oracle、PostgreSQL 或 SQL Server 等），它致力于为单个应用程序提供本地存储，强调经济性、效率、可靠性、独立性和简单性，而不追求可伸缩性、并发性、集中性和控制性。\\n\",\n    \"\\n\",\n    \"Python3 内置了一个名为 `sqlite3` 标准模块，提供了 SQLite 数据库操作的一整套接口，本文是利用该模块实现数据库操作的零基础入门教程。\\n\",\n    \"\\n\",\n    \"\u003e sqlite3 是以 [pysqlite](http://github.com/ghaering/pysqlite) 的名称在外部进行开发，其开发参考了 [PEP 249](https://www.python.org/dev/peps/pep-0249) 定义的 `Database API Specification 2.0`（数据库接口规范 2.0），以及 [SQLite](https://www.sqlite.org/) 官网提供的 SQL 语法和数据类型。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 安装\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"`sqlite3` 是 Python3 的内置标准模块，不用额外安装。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 教程\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"这里简要介绍一下数据库操作的一般流程：\\n\",\n    \"\\n\",\n    \"1. 开启数据库连接\\n\",\n    \"2. 新建游标\\n\",\n    \"3. 调用游标执行 SQL 语句\\n\",\n    \"4. 关闭游标\\n\",\n    \"5. 提交数据库更改（如果抛出异常，则回滚）\\n\",\n    \"6. 关闭数据库连接\\n\",\n    \"\\n\",\n    \"最常见的增删改查操作都通过执行 SQL 语句中实现。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 创建和关闭数据库连接\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"如要使用该模块，首先必须创建一个表示数据库的 `Connection` 对象。\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"如果不存在 `demo.db` 文件，将自动创建；如果存在，则直接进行连接。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 新建表\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"一旦你有了一个 `Connection`，你可以创建一个 `Cursor` 对象，并调用它的 `execute()` 方法来执行 SQL 命令，比如在数据库中新建一个名为 `student` 的表。\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"cursor.execute('''\\n\",\n    \"    create table student(\\n\",\n    \"        id integer primary key autoincrement not null,\\n\",\n    \"        name text,\\n\",\n    \"        age integer\\n\",\n    \"    )\\n\",\n    \"''')\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"如果表已经存在，会抛出 `OperationalError` 异常。为避免抛出该异常，可以使用 Python 的异常捕捉进行处理，也可以在 SQL 语句中进行表是否存在的判断。\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"cursor.execute('''\\n\",\n    \"    create table if not exists student(\\n\",\n    \"        id integer primary key autoincrement not null,\\n\",\n    \"        name text,\\n\",\n    \"        age integer\\n\",\n    \"    )\\n\",\n    \"''')\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 插入记录【增】\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"接下来，让我们向表中插入几条记录用于测试。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"- 插入一条记录\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"data = (1, 'john', 18)\\n\",\n    \"sql = 'insert into student values (?, ?, ?)'\\n\",\n    \"cursor.execute(sql, data)\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"- 插入多行记录\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"data = [\\n\",\n    \"    (2, 'lily', 19),\\n\",\n    \"    (3, 'mike', 20)\\n\",\n    \"]\\n\",\n    \"sql = 'insert into student values (?, ?, ?)'\\n\",\n    \"cursor.executemany(sql, data)\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"通常，你不应该使用 Python 的字符串操作来组合 SQL 语句，因为这样做是不安全的，容易受到 SQL 注入攻击。正确的做法是使用 `?` 作为占位符，然后将值的元组或元组嵌套的列表作为第二个参数传递给 execute() 或executemany() 方法。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 查询记录【查】\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"- 查询表中所有字段的记录\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"(1, 'john', 18)\\n\",\n      \"(2, 'lily', 19)\\n\",\n      \"(3, 'mike', 20)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"sql = 'select * from student'\\n\",\n    \"cursor.execute(sql)\\n\",\n    \"for item in cursor:\\n\",\n    \"    print(item)\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"- 查询表中指定字段的记录\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"('john',)\\n\",\n      \"('lily',)\\n\",\n      \"('mike',)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"sql = 'select name from student'\\n\",\n    \"cursor.execute(sql)\\n\",\n    \"for item in cursor:\\n\",\n    \"    print(item)\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"- 根据条件查询表中的记录\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"(1, 'john', 18)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"sql = 'select * from student where age = 18'\\n\",\n    \"cursor.execute(sql)\\n\",\n    \"for item in cursor:\\n\",\n    \"    print(item)\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 修改记录【改】\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"例如，将 `mike` 的 `name` 修改为 `mary`。\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"sql = \\\"update student set name = 'mary' where name = 'mike'\\\"\\n\",\n    \"cursor.execute(sql)\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 删除记录【删】\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"- 按条件删除表记录\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"sql = \\\"delete from student where name = 'lily'\\\"\\n\",\n    \"cursor.execute(sql)\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"- 清空表中所有记录\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"sql = 'delete from student'\\n\",\n    \"cursor.execute(sql)\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 删除表\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sqlite3\\n\",\n    \"conn = sqlite3.connect('demo.db')\\n\",\n    \"cursor = conn.cursor()\\n\",\n    \"sql = 'drop table student'\\n\",\n    \"cursor.execute(sql)\\n\",\n    \"conn.commit()\\n\",\n    \"cursor.close()\\n\",\n    \"conn.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 附录\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"数据库表操作常用的 SQL 命令：\\n\",\n    \"\\n\",\n    \"| 功能                     | 命令                                                                                                                         |\\n\",\n    \"|--------------------------|------------------------------------------------------------------------------------------------------------------------------|\\n\",\n    \"| 新建表                   | create table [if not exists] `TABLE_NAME` `COLUMN_DEF`                                                                       |\\n\",\n    \"| 清空表中所有记录         | delete from `TABLE_NAME`                                                                                                     |\\n\",\n    \"| 按条件清除表记录         | delete from `TABLE_NAME` where `EXPR`                                                                                        |\\n\",\n    \"| 删除表                   | drop table [if exists] `TABLE_NAME`                                                                                          |\\n\",\n    \"| 查看表字段               | pragma table_info(`TABLE_NAME`)                                                                                              |\\n\",\n    \"| 修改表名称               | alter table `OLD_TABLE_NAME` rename to `NEW_TABLE_NAME`                                                                      |\\n\",\n    \"| 添加表字段               | alter table `TABLE_NAME` add `NEW_COLUMN_NAME` [`COLUMN_DEF`]                                                                |\\n\",\n    \"| 删除表字段               | alter table `TABLE_NAME` drop `COLUMN_NAME`                                                                                  |\\n\",\n    \"| 修改字段名               | alter table `TABLE_NAME` rename column `OLD_COLUMN_NAME` to `NEW_COLUMN_NAME`                                                |\\n\",\n    \"| 插入表记录               | insert into `TABLE_NAME` [(`COLUMN_NAME`)] values (`EXPR`)                                                                   |\\n\",\n    \"| 向表中插入查询返回的数据 | insert into `TABLE_NAME` select `EXPR`                                                                                       |\\n\",\n    \"| 在表末尾插入一条默认数据 | insert into `TABLE_NAME` default values                                                                                      |\\n\",\n    \"| 更新表记录               | update `TABLE_NAME` set `COLUMN1_NAME` = `EXPR1` , `COLUMN2_NAME` = `EXPR2` [from `TABLE_NAME` or `SUBQUERY`] [where `EXPR`] |\\n\",\n    \"| 查询表中所有字段的记录   | select * from `TABLE_NAME` [where `EXPR`] [group by `EXPR`] [order by `ORDERING-TERM`] [limit `EXPR`]                        |\\n\",\n    \"| 查询表中指定字段的记录   | select `COLUMN1_NAME` , `COLUMN2_NAME` from `TABLE_NAME`                                                                     |\\n\",\n    \"\\n\",\n    \"更多关于 SQL 语句的详细信息请参见[官方文档](https://www.sqlite.org/doclist.html)。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 概念\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 数据类型\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"SQLite 官方定义了如下五种[数据类型](https://www.sqlite.org/datatype3.html)：\\n\",\n    \"\\n\",\n    \"- NULL：空值。\\n\",\n    \"- INTEGER：整数。\\n\",\n    \"- REAL：小数。\\n\",\n    \"- TEXT：文本字符串。\\n\",\n    \"- BLOB：二进制对象。\\n\",\n    \"\\n\",\n    \"SQLite 没有单独的布尔数据存储类型，布尔值被存储为整数 0 (false) 和 1 (true)。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"在 sqlite3 模块中，Python 数据类型和 SQLite 数据类型可以相互转换。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Python 数据类型在 SQLite 中的呈现方式：\\n\",\n    \"\\n\",\n    \"| Python type        | SQLite type    |\\n\",\n    \"|--------------------|----------------|\\n\",\n    \"| None               | NULL           |\\n\",\n    \"| int                | INTEGER        |\\n\",\n    \"| long               | INTEGER        |\\n\",\n    \"| float              | REAL           |\\n\",\n    \"| str (UTF8-encoded) | TEXT           |\\n\",\n    \"| unicode            | TEXT           |\\n\",\n    \"| buffer             | BLOB           |\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"SQLite 数据类型在 Python 中按照如下方式转换：\\n\",\n    \"\\n\",\n    \"| SQLite type    | Python type                                                       |\\n\",\n    \"|----------------|-------------------------------------------------------------------|\\n\",\n    \"| NULL           | None                                                              |\\n\",\n    \"| INTEGER        | int or long, depending on size                                    |\\n\",\n    \"| REAL           | float                                                             |\\n\",\n    \"| TEXT           | depends on text_factory, unicode by default                       |\\n\",\n    \"| BLOB           | buffer                                                            |\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 字段定义\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"除数据类型外，定义字段时还有很多其他可选参数：\\n\",\n    \"\\n\",\n    \"- primary key：主键。其值能唯一标识表中的每一行。\\n\",\n    \"- primary key autoincrement：主键自增。插入数据时无需带上主键的值，因为它可以自动递增赋值。\\n\",\n    \"- not null：非空。该字段内不允许出现空值。\\n\",\n    \"- unique：唯一。该字段内不允许出现重复值。\\n\",\n    \"- default：默认。设置该字段的默认值。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 接口\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Connection\\n\",\n    \"\\n\",\n    \"Connection 对象主要实现了以下方法：\\n\",\n    \"\\n\",\n    \"- .close()：关闭数据库连接。关闭之后，试图对数据库进行的任何操作都将引发 `Error` 异常。\\n\",\n    \"- .commit()：提交所有挂起的任务到数据库。\\n\",\n    \"- .rollback()：回滚数据库到挂起任务尚未执行之前。值得注意的是，如果在没有提交更改的情况下就关闭了数据库连接，将会自动执行隐式回滚。\\n\",\n    \"- .cursor()：返回一个新的使用该连接的 `Cursor` 对象。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Cursor\\n\",\n    \"\\n\",\n    \"Cursor 对象主要实现了以下属性和方法：\\n\",\n    \"\\n\",\n    \"- 属性\\n\",\n    \"  - .description：游标描述信息。如果没有有意义的信息，就返回 `None`。\\n\",\n    \"  - .rowcount：执行最后一个 SQL 语句操作的行数。如果没有 SQL 语句执行，返回 `-1`。\\n\",\n    \"- 方法\\n\",\n    \"  - .close()：关闭游标。关闭之后，试图对游标进行的任何操作都将引发 `Error` 异常。\\n\",\n    \"  - .execute(sql [, parameters])：准备并执行 SQL 语句。\\n\",\n    \"  - .executemany(sql, seq_of_parameters)：准备并执行 SQL 语句。接受的参数是一个序列。\\n\",\n    \"  - .fetchone()：获取查询结果中的一行，返回单个序列。如果查询结果结果是空，返回 `None`。如果之前执行的 sql 语句没有任何返回结果，抛出 `Error` 异常。\\n\",\n    \"  - .fetchmany([size=cursor.arraysize])：获取多行查询结果，返回一个嵌套的序列，例如，嵌套在列表里面的元组。\\n\",\n    \"  - .fetchall()：获取查询结果的所有行，返回一个嵌套的序列。\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 参考\\n\",\n    \"\\n\",\n    \"\u003e - [SQLite Home Page](https://www.sqlite.org/index.html)\\n\",\n    \"\u003e - [PEP 249 – Python Database API Specification v2.0](https://peps.python.org/pep-0249/)\\n\",\n    \"\u003e - [sqlite3 — DB-API 2.0 interface for SQLite databases](https://pysqlite.readthedocs.io/en/latest/sqlite3.html)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"interpreter\": {\n   \"hash\": \"ecf5722fdaf1897a315d257d89d94520bfcaa453217d5becf09b39e73618b0de\"\n  },\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.9.1\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxavierjiezou%2Fpython-sqlite3-tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxavierjiezou%2Fpython-sqlite3-tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxavierjiezou%2Fpython-sqlite3-tutorial/lists"}