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

Python怎么让程序和数据库直接连起来,顺便把代码存进去也能搞定

你想让Python程序能和数据库“说上话”,还能把代码存进去,这个想法很实际,说白了,就是让程序能找到一个地方,把一些数据(包括你写的代码片段)长久地存起来,以后想用的时候再拿出来,我们一步一步来,用最直白的方式说清楚。

你得选一个数据库,这就好比你要存东西,得先找个箱子,对于刚开始做这件事,SQLite是个特别好的选择,为什么?因为它就像一个文件,你不需要安装任何复杂的数据库软件,Python自己就带着能操作它的工具(叫做sqlite3库),你把数据库文件放在你的项目文件夹里就行,非常轻便,特别适合自己学习或者小项目。

选好了“箱子”(数据库),接下来就得让Python和这个箱子建立“连接”,在Python里,这个过程很简单,你只需要用到Python自带的sqlite3这个模块,下面这几行代码就是建立连接的核心:

import sqlite3
# 连接到数据库文件,如果文件不存在,它会自动创建一个
conn = sqlite3.connect('my_database.db')

这里,my_database.db就是你那个“箱子”的名字,也就是数据库文件。conn这个变量现在就代表了程序和数据库之间的这条“电话线”,后续的所有操作都要通过它来进行。

光有连接还不行,你得能下命令,你跟箱子说“打开盖子”、“把东西放进去”,在数据库里,这个下命令的家伙叫做“游标”(Cursor),你可以把它想象成你的手,通过这只手去执行具体的动作。

Python怎么让程序和数据库直接连起来,顺便把代码存进去也能搞定

# 创建一个游标对象
cursor = conn.cursor()

连接有了,“手”也有了,最关键的一步来了:设计箱子里的结构,数据库里是用“表”来存放数据的,表就像Excel表格,有固定的列,你需要先定义好这个表的结构,我们想存代码片段,可以设计一个表,里面包含“代码的标题”、“代码本身”、“写代码的日期”这几列。

定义表结构用的语言叫SQL,别怕,它读起来很像英语,下面这句SQL命令的意思就是:“创建一个叫snippets的表,里面有三个列:id(是主键,会自动增长)、title(是文本类型)、code(也是文本类型)、created_date(是文本类型)”。

# 执行一条SQL语句,创建一个表
cursor.execute('''
    CREATE TABLE IF NOT EXISTS snippets (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT NOT NULL,
        code TEXT NOT NULL,
        created_date TEXT NOT NULL
    )
''')

注意这里的CREATE TABLE IF NOT EXISTS,它的意思是“如果这个表还不存在,就创建它”,这样即使你多次运行程序,也不会报错说表已经存在。

表创建好了,空箱子已经准备好了格子,现在可以往里存东西了,也就是“插入”数据,假设我们想存一段Python代码,标题是“问候函数”,代码如下:

Python怎么让程序和数据库直接连起来,顺便把代码存进去也能搞定

# 定义要插入的数据= "问候函数"
code = """
def say_hello(name):
    print(f"Hello, {name}!")
"""
created_date = "2023-10-27"
# 执行插入数据的SQL语句
cursor.execute("INSERT INTO snippets (title, code, created_date) VALUES (?, ?, ?)", (title, code, created_date))

这里又用到了SQL语句INSERT INTO ... VALUES ...,注意看VALUES后面是三个问号,这是一种安全的做法,先把位置占住,然后再把真正的数据(title, code, created_date)作为一个元组传进去,这样可以防止一种叫做“SQL注入”的安全风险,让你的程序更结实。

命令是发出去了,但数据真的进箱子了吗?还没有,为了保证效率,数据库通常不会你一下令它就马上执行,而是会先攒着,你需要最后发一个“确认”指令,这个动作叫“提交”(Commit)。

# 提交事务,使更改生效
conn.commit()

只有执行了commit(),你刚才的插入操作才被真正保存到数据库文件里。

存进去之后,你肯定还想看看里面有什么,或者把它取出来用,这就是“查询”操作。

Python怎么让程序和数据库直接连起来,顺便把代码存进去也能搞定

# 执行查询语句,选取snippets表里的所有数据
cursor.execute("SELECT * FROM snippets")
# 获取所有查询结果
results = cursor.fetchall()
# 打印结果
for row in results:
    print(f"ID: {row[0]}")
    print(f"标题: {row[1]}")
    print(f"代码: {row[2]}")
    print(f"日期: {row[3]}")
    print("-" * 20)

SELECT * FROM snippets从snippets表里选取所有列的所有数据”的意思。fetchall()方法会把所有结果都拿出来,返回一个列表,列表里的每个元素就是一行数据。

所有事情都做完了,别忘了礼貌地“挂断电话”和“收回手”,也就是关闭游标和连接,释放资源。

# 关闭游标和连接
cursor.close()
conn.close()

把上面所有的代码片段按顺序组合起来,就是一个完整的、可以将代码片段存入SQLite数据库并能查询出来的Python程序了,你运行这个程序,它会在同目录下创建一个my_database.db文件,你的代码就安全地躺在里面了。

整个过程就像:找箱子(选数据库) -> 打通电话(建立连接) -> 伸出手(创建游标) -> 规划格子(创建表) -> 放进东西(插入数据) -> 确认一下(提交事务) -> 查看东西(查询数据) -> 挂断电话(关闭连接),你按照这个流程,就能轻松搞定Python和数据库的基本交互了。

(本回答中涉及的Python与SQLite数据库连接方法,参考自Python官方文档中关于sqlite3库的说明,以及常见的数据库操作实践。)