class BookCollection:
def __init__(self, db_name="book_collection.db"):
"""初始化数据库连接和创建表"""
self.db_name = db_name
self.conn = None
self.cursor = None
self._connect()
self._create_table()
def _connect(self):
"""连接到SQLite数据库"""
try:
self.conn = sqlite3.connect(self.db_name)
self.cursor = self.conn.cursor()
print(f"成功连接到数据库: {self.db_name}")
except sqlite3.Error as e:
print(f"数据库连接错误: {e}")
def _create_table(self):
"""创建图书表"""
try:
# 创建books表,包含图书基本信息
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT NOT NULL,
publisher TEXT,
isbn TEXT UNIQUE,
publication_year INTEGER,
added_date TEXT DEFAULT CURRENT_DATE,
read_status TEXT DEFAULT '未读',
rating INTEGER CHECK(rating BETWEEN 1 AND 5)
)
''')
self.conn.commit()
print("图书表创建成功或已存在")
except sqlite3.Error as e:
print(f"创建表错误: {e}")
问题1:self.cursor.execute是哪里来的,为什么可以用cursor.execute
答案:self.cursor = self.conn.cursor():通过连接对象的 cursor() 方法创建游标对象,存储在 self.cursor 中。
为什么需要游标(cursor)? 游标(cursor)是数据库操作的 “执行者”,它的作用是:
执行 SQL 语句(通过 execute() 方法)。 获取查询结果(通过 fetchone()、fetchall() 等方法)。
简单说,self.conn 负责与数据库建立连接,而 self.cursor 负责具体的 SQL 执行和结果处理。因此,代码中所有的 SQL 操作(如创建表、插入数据、查询等)都通过 self.cursor.execute() 来完成。
问题2:为什么
self.cursor.execute(''' CREATE TABLE books ( id INTEGER PRIMARY KEY AUTOINCREMENT, ) ''') 为什么创建表格前后是三个引号
答案:在 Python 中,self.cursor.execute() 中的 SQL 语句使用三个引号(''' 或 """)是为了创建多行字符串
- 支持多行格式化 SQL 创建表的语句通常包含多个字段和约束,写成多行更清晰易读。三个引号允许字符串直接换行,不需要使用 \n 转义符,例如:
# 多行字符串(清晰) sql = ''' CREATE TABLE books ( id INTEGER PRIMARY KEY, title TEXT NOT NULL ) '''
# 对比:单行字符串(混乱) sql = "CREATE TABLE books (id INTEGER PRIMARY KEY, title TEXT NOT NULL)"
- 保留格式和缩进 三个引号包裹的字符串会保留编写时的缩进和换行,让 SQL 语句的结构(如字段缩进、括号对应)更直观,便于后期维护和修改。
- 三个引号是 Python 中处理长字符串的语法糖
问题3:self.cursor.fetchone() 是什么意思
与其他获取结果方法的区别:
- fetchone():获取一条记录(适合只需要一条结果的场景,如判断是否存在)。
- fetchall():获取所有记录(返回一个包含所有结果的列表,适合需要批量处理的场景)。
- fetchmany(n):获取最多 n 条记录(适合大数据量分页查询)。
注意: 调用 fetchone() 前必须先执行查询语句(如 cursor.execute("SELECT ...")),否则会报错。 若结果已全部读取(指针到达末尾),再次调用 fetchone() 会返回 None。