当前位置:首页 > 问答 > 正文

想知道怎么把一个list直接存数据库里,定义好list后一步步操作讲解

想知道怎么把一个列表直接存到数据库里,这个需求很常见,比如你有一个购物车里的商品ID列表,或者是一串用户留言的标题,你想把它们一股脑儿存进数据库,而不是一个一个地存,下面我就用一个最简单的例子,一步步讲清楚怎么操作,我们假设你用的是 Python 语言和一个叫 SQLite 的轻量级数据库,因为它不用安装,直接就能用,最适合讲解。

第一步:准备好你的列表和数据库连接

你手里得有一个列表,我们定义一个简单的列表,里面是一些书名: my_book_list = ["红楼梦", "三国演义", "水浒传", "西游记"]

光有列表还不行,你得先连接到数据库,在 Python 里,我们可以用内置的 sqlite3 模块。

import sqlite3
# 连接到数据库文件,如果不存在,它会被自动创建
conn = sqlite3.connect('my_database.db')
# 创建一个“游标”,你可以把它想象成一个帮你执行SQL命令的手
cursor = conn.cursor()

这样,我们就和数据库建立好联系了。

第二步:创建一张能存放列表的表

数据库里数据是存放在“表”里的,就像 Excel 工作表一样,所以我们需要先创建一张表,既然我们要存一个书名的列表,最简单的办法就是创建一张只有一列的表,这一列专门用来放书名。

# 执行一条SQL命令来创建表
cursor.execute('''
    CREATE TABLE IF NOT EXISTS books (
        id INTEGER PRIMARY KEY AUTOINCREMENT, -- 这一列是自动增长的ID号,每个书名有一个唯一编号
        book_name TEXT NOT NULL -- 这一列是书名,类型是文本,不能为空
    )
''')

这里稍微解释一下(来源:SQL语法基本概念):

  • CREATE TABLE 是创建表的命令。
  • IF NOT EXISTS 的意思是如果这张表不存在才创建,避免了重复创建报错。
  • books 是表的名字。
  • id 那一列是主键,它会自动从1开始增长,这样每本书都有个唯一标识,方便以后查找和管理。
  • book_name 就是我们用来存书名的列。

执行完这个,一张空表就在数据库里准备好了。

第三步:把列表里的数据“插入”到表中

这是最关键的一步,怎么把 my_book_list 这个列表里的所有书名,一次性存进数据库的 books 表里。

你不能直接把整个列表扔给数据库,需要用到 SQL 的 INSERT 语句,最笨的方法是一个一个地插入,用 for 循环:

for book in my_book_list:
    cursor.execute("INSERT INTO books (book_name) VALUES (?)", (book,))

这个方法可行,但是效率不高,尤其是列表很长的时候,更专业、更高效的做法是使用 executemany() 方法(来源:Python sqlite3官方文档),这个方法专门用来一次性插入多条数据。

具体怎么做呢?executemany() 需要两个东西:

  1. 一条带占位符的 SQL 语句。
  2. 一个包含所有数据的列表,列表里的每个元素都是一组要插入的数据。

我们的 SQL 语句是:INSERT INTO books (book_name) VALUES (?) 问号 就是一个占位符,表示“这里等下会被实际的数据替换”。

我们的数据是 my_book_list,但它的样子是 ["红楼梦", "三国演义", ...],而 executemany() 期望的数据格式是:[("红楼梦",), ("三国演义",), ...],注意看,它需要是一个列表,里面每个元素是一个元组,哪怕元组里只有一个值,后面也要加个逗号。

所以我们需要稍微转换一下:

# 把列表中的每个元素变成单个元素的元组
data_to_insert = [(book,) for book in my_book_list]
# 使用executemany一次性插入所有数据
cursor.executemany("INSERT INTO books (book_name) VALUES (?)", data_to_insert)

这两行代码就完成了整个列表的插入工作,非常高效。

第四步:确认操作并关闭连接

在数据库操作中,你执行了修改(比如插入、删除、更新)之后,需要一个“确认”的动作,这个动作叫“提交”(commit),不然,你的更改可能只存在于内存里,并没有真正保存到数据库文件中,提交之后,还要记得关闭连接,释放资源。

# 提交事务,让所有操作生效
conn.commit()
# 关闭连接
conn.close()

第五步:验证一下存进去了没

为了确认我们的操作成功了,可以写几行代码查一下看看。

# 重新连接数据库
conn = sqlite3.connect('my_database.db')
cursor = conn.cursor()
# 执行查询,选取books表里的所有数据
cursor.execute("SELECT * FROM books")
# 获取所有查询结果
all_books = cursor.fetchall()
# 打印结果
print(all_books)
# 关闭连接
conn.close()

你会看到终端打印出类似这样的结果:[(1, '红楼梦'), (2, '三国演义'), (3, '水浒传'), (4, '西游记')],这说明数据已经成功地、整整齐齐地躺在数据库里了,而且还自动带上了ID。

总结一下整个流程:

  1. 连接数据库:用 sqlite3.connect
  2. 创建表:用 cursor.execute 执行 CREATE TABLE 语句,设计好表的结构。
  3. 转换并插入数据:把普通的列表转换成由元组构成的列表,然后用 cursor.executemany 配合 INSERT ... VALUES (?) 语句一次性插入。
  4. 提交和关闭:用 conn.commit() 确认保存,然后用 conn.close() 关闭连接。

这就是把一个列表直接存入数据库的完整步骤,虽然这里用的是 SQLite 和书名列表,但思路是通用的,如果你用 MySQL 或 PostgreSQL,只是最开始连接数据库的方式不一样,后面插入数据的逻辑是完全相似的。

想知道怎么把一个list直接存数据库里,定义好list后一步步操作讲解