
本文旨在指导开发者如何使用Python将列表数据高效地写入SQL Server数据库表中。通过使用`ast.literal_eval()`安全地解析包含列表数据的文本文件,并结合`cursor.executemany()`方法,可以实现批量数据插入,避免手动解析和逐行插入,从而提高数据处理效率。
准备工作
在开始之前,请确保已安装以下组件:
- Python: 建议使用Python 3.6或更高版本。
- pyodbc: 用于连接SQL Server数据库的Python库。可以使用pip install pyodbc安装。
- SQL Server: 确保已安装并运行SQL Server数据库,并拥有可供写入数据的数据库和表。
步骤详解
以下步骤详细介绍了如何将Python列表数据写入SQL Server数据库表:
-
连接到SQL Server数据库:
立即学习“Python免费学习笔记(深入)”;
首先,需要使用pyodbc库建立与SQL Server数据库的连接。请替换以下代码中的连接字符串,使其与你的数据库配置相匹配。
import pyodbc # 连接字符串,请根据实际情况修改 connection_string = ( r'DRIVER={SQL Server};' r'SERVER=your_server_name;' r'DATABASE=your_database_name;' r'UID=your_user_id;' r'PWD=your_password;' ) try: cnxn = pyodbc.connect(connection_string) cursor = cnxn.cursor() print("数据库连接成功!") except pyodbc.Error as ex: sqlstate = ex.args[0] print(f"数据库连接失败: {sqlstate}") exit()注意事项:
- 确保已安装SQL Server的ODBC驱动程序。
- 连接字符串中的your_server_name、your_database_name、your_user_id和your_password需要替换为实际的值。
- 如果使用Windows身份验证,连接字符串可能需要进行相应的修改。
-
读取包含列表数据的文件:
小麦企业网站展示系统1.1下载小麦企业网站展示系统介绍:一、安装使用将xiaomai.sql导入数据库二、后台登录后台帐号,密码默认都是admin,config.php 配置文件可根据自行需要修改,IP地址,数据库用户名,密码,及表名后台目录默认admin,支持自行任意修改目录名三、注意事项1 本源码完全免费,采用伪静态,减少不必要的源码重复,速度更快,支持二次开发。2、注明本程序编码为UTF8,如发生乱码,请注意修改编码3、
假设你有一个名为files.txt的文本文件,其中包含如下格式的列表数据:
[['ID', '001'], ['Name', 'Jon'], ['Score', '90'], ['Semester', 'Fall']] [['ID', '002'], ['Name', 'Ama'], ['Score', '87'], ['Semester', 'Fall']]
以下代码演示了如何读取文件并使用ast.literal_eval()安全地解析每一行数据:
from ast import literal_eval file_path = 'files.txt' data_list = [] try: with open(file_path, 'r') as file: for line in file: # 使用 ast.literal_eval 安全地解析字符串为列表 try: data = literal_eval(line.strip()) # 提取值,忽略键 row = [value for field, value in data] data_list.append(row) except (ValueError, SyntaxError) as e: print(f"解析行时出错: {line.strip()}, 错误信息: {e}") except FileNotFoundError: print(f"文件未找到: {file_path}") exit() print(f"成功解析 {len(data_list)} 行数据.")代码解释:
- ast.literal_eval()函数可以将字符串安全地解析为Python字面量,例如列表、字典等。
- 使用try...except块处理可能出现的ValueError或SyntaxError,例如文件内容格式不正确。
-
将数据写入SQL Server数据库表:
现在,可以使用cursor.executemany()方法将解析后的数据批量写入SQL Server数据库表。请确保已创建相应的表,并替换以下代码中的表名和列名。
# 假设数据库表中包含 id, name, score, semester 四列 sql_insert = "INSERT INTO yourTable (id, name, score, semester) VALUES (?, ?, ?, ?)" try: cursor.executemany(sql_insert, data_list) cnxn.commit() # 提交事务 print(f"成功插入 {cursor.rowcount} 行数据到数据库.") except pyodbc.Error as ex: sqlstate = ex.args[0] print(f"数据库插入失败: {sqlstate}") cnxn.rollback() # 回滚事务,防止数据不一致 # 关闭游标和连接 cursor.close() cnxn.close() print("数据库连接已关闭.")代码解释:
- cursor.executemany()方法可以批量执行SQL语句,提高数据插入效率。
- cnxn.commit()用于提交事务,将数据写入数据库。
- cnxn.rollback()用于回滚事务,在发生错误时撤销所有操作,保证数据一致性。
- 使用try...except块处理可能出现的数据库错误,例如表不存在、列名不正确等。
完整代码示例
import pyodbc
from ast import literal_eval
# 数据库连接字符串,请根据实际情况修改
connection_string = (
r'DRIVER={SQL Server};'
r'SERVER=your_server_name;'
r'DATABASE=your_database_name;'
r'UID=your_user_id;'
r'PWD=your_password;'
)
file_path = 'files.txt'
data_list = []
try:
cnxn = pyodbc.connect(connection_string)
cursor = cnxn.cursor()
print("数据库连接成功!")
try:
with open(file_path, 'r') as file:
for line in file:
# 使用 ast.literal_eval 安全地解析字符串为列表
try:
data = literal_eval(line.strip())
# 提取值,忽略键
row = [value for field, value in data]
data_list.append(row)
except (ValueError, SyntaxError) as e:
print(f"解析行时出错: {line.strip()}, 错误信息: {e}")
except FileNotFoundError:
print(f"文件未找到: {file_path}")
exit()
print(f"成功解析 {len(data_list)} 行数据.")
# 假设数据库表中包含 id, name, score, semester 四列
sql_insert = "INSERT INTO yourTable (id, name, score, semester) VALUES (?, ?, ?, ?)"
try:
cursor.executemany(sql_insert, data_list)
cnxn.commit() # 提交事务
print(f"成功插入 {cursor.rowcount} 行数据到数据库.")
except pyodbc.Error as ex:
sqlstate = ex.args[0]
print(f"数据库插入失败: {sqlstate}")
cnxn.rollback() # 回滚事务,防止数据不一致
# 关闭游标和连接
cursor.close()
cnxn.close()
print("数据库连接已关闭.")
except pyodbc.Error as ex:
sqlstate = ex.args[0]
print(f"数据库连接失败: {sqlstate}")
exit()总结
本文详细介绍了如何使用Python将列表数据写入SQL Server数据库表。通过使用ast.literal_eval()安全地解析数据,并结合cursor.executemany()方法进行批量插入,可以高效地完成数据导入任务。在实际应用中,请根据具体情况修改代码,例如调整连接字符串、表名、列名等。同时,务必注意错误处理,确保程序的健壮性和数据的完整性。









