使用Python操作SQL Server:查询与插入数据问题求助
先解决你的DataFrame写入错误
你碰到的AttributeError: 'DataFrame' object has no attribute 'write',基本可以确定是操作了pandas DataFrame而非Spark DataFrame——只有Spark DataFrame自带write接口,pandas的DataFrame没有这个方法。
解决步骤:
- 先确认DataFrame类型:打印
type(df),如果输出是<class 'pandas.core.frame.DataFrame'>,那就是pandas的。 - 若API返回的是pandas DataFrame,转成Spark DataFrame即可:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("APItoDB").getOrCreate() spark_df = spark.createDataFrame(pandas_df) - 之后用Spark的
write.jdbc写入数据库:spark_df.write.jdbc( url="jdbc:sqlserver://你的服务器地址:1433;databaseName=目标数据库;", table="要写入的表名", mode="append", # 可选模式:append(追加)/overwrite(覆盖)/ignore(跳过)/error(报错,默认) properties={"user": "数据库账号", "password": "数据库密码"} )
Python填充数据库表:DataFrame vs SQL命令
没有绝对最优,得看你的业务场景:
1. 使用DataFrame(Spark或pandas)——适合批量数据
适用场景:
- 数据量较大(万条及以上),需要高效批量写入
- 数据已经是结构化格式(比如API返回的JSON/CSV转成了DataFrame)
- 不需要复杂业务逻辑,仅做单纯的插入/覆盖操作
实现方式:
方式A:Spark DataFrame(推荐大数据量)
如果API返回的是结构化列表,直接转成Spark DataFrame写入:
# 示例:API返回的结构化数据列表 api_data = [{"id":1, "name":"Alice"}, {"id":2, "name":"Bob"}] spark_df = spark.createDataFrame(api_data) # 写入SQL Server spark_df.write.jdbc( url="jdbc:sqlserver://你的服务器地址:1433;databaseName=目标数据库;", table="employees", mode="append", properties={"user": "账号", "password": "密码"} )
方式B:pandas DataFrame(适合中小数据量)
用pandas自带的to_sql方法,需要依赖sqlalchemy:
import pandas as pd from sqlalchemy import create_engine # 构建SQL Server连接字符串 conn_str = "mssql+pyodbc://账号:密码@服务器地址/数据库名?driver=ODBC+Driver+17+for+SQL+Server" engine = create_engine(conn_str) # 假设api_df是API返回转成的pandas DataFrame api_df.to_sql( name="employees", con=engine, if_exists="append", # 可选:append(追加)/replace(覆盖)/fail(报错) index=False )
2. 使用SQL命令——适合复杂逻辑或少量数据
适用场景:
- 插入前需要做复杂校验、关联查询
- 单条或少量数据的插入/更新
- 需要执行带计算、条件的自定义SQL语句
实现方式:
用pyodbc直接执行SQL:
import pyodbc # 建立数据库连接 conn = pyodbc.connect( "DRIVER={ODBC Driver 17 for SQL Server};" "SERVER=你的服务器地址;" "DATABASE=目标数据库;" "UID=账号;" "PWD=密码" ) cursor = conn.cursor() # 单条数据插入 insert_sql = "INSERT INTO employees (id, name) VALUES (?, ?)" cursor.execute(insert_sql, (3, "Charlie")) # 批量插入(executemany适合多条数据) batch_data = [(4, "David"), (5, "Eve")] cursor.executemany(insert_sql, batch_data) # 提交事务并关闭连接 conn.commit() cursor.close() conn.close()
内容的提问来源于stack exchange,提问作者yoelbenyossef
相关产品推荐
相关产品推荐

