You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python备份SharePoint元数据至Azure SQL遇阻求助

解决方案:SharePoint文档库元数据备份到Azure SQL

一、权限与API访问校验

  • 确认Azure AD应用已授予Sites.Read.All(或更精准的Sites.Selected)应用权限,且完成管理员同意流程。
  • 验证Microsoft Graph API访问令牌的权限范围,可通过令牌解析工具确认权限是否包含目标站点的访问权限。

二、用Microsoft Graph API提取元数据

1. 获取目标文档库ID

import requests

token = "你的应用访问令牌"
site_domain = "yourtenant.sharepoint.com"
site_path = "/sites/yoursite"
library_name = "目标文档库名称"

# 获取站点ID
site_res = requests.get(
    f"https://graph.microsoft.com/v1.0/sites/{site_domain}:{site_path}",
    headers={"Authorization": f"Bearer {token}"}
)
site_id = site_res.json()["id"]

# 获取文档库ID
lists_res = requests.get(
    f"https://graph.microsoft.com/v1.0/sites/{site_id}/lists",
    headers={"Authorization": f"Bearer {token}"}
)
library = [lst for lst in lists_res.json()["value"] if lst["displayName"] == library_name][0]
library_id = library["id"]

2. 批量拉取文档及元数据

# 拉取所有文档项(含自定义元数据,需替换为你的列名)
items_res = requests.get(
    f"https://graph.microsoft.com/v1.0/sites/{site_id}/lists/{library_id}/items?expand=fields&select=id,fields",
    headers={"Authorization": f"Bearer {token}"}
)
items = items_res.json()["value"]

# 提取目标元数据
metadata_list = []
for item in items:
    fields = item["fields"]
    metadata = {
        "item_id": item["id"],
        "filename": fields.get("FileLeafRef"),
        "custom_col1": fields.get("你的自定义列1内部名称"),
        "custom_col2": fields.get("你的自定义列2内部名称"),
        "created_time": fields.get("Created")
    }
    metadata_list.append(metadata)

# 处理分页(若项数超过100)
while "@odata.nextLink" in items_res.json():
    next_url = items_res.json()["@odata.nextLink"]
    items_res = requests.get(next_url, headers={"Authorization": f"Bearer {token}"})
    items.extend(items_res.json()["value"])

三、写入Azure SQL数据库

import pyodbc

# 构建连接字符串
conn_str = (
    "Driver={ODBC Driver 17 for SQL Server};"
    "Server=tcp:你的SQL服务器名.database.windows.net,1433;"
    "Database=你的数据库名;"
    "Uid=你的用户名;"
    "Pwd=你的密码;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
    "Connection Timeout=30;"
)

# 批量插入数据
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

insert_sql = """
INSERT INTO DocumentBackup (ItemId, Filename, CustomCol1, CustomCol2, CreatedTime)
VALUES (?, ?, ?, ?, ?)
"""

for meta in metadata_list:
    cursor.execute(insert_sql,
                   meta["item_id"],
                   meta["filename"],
                   meta["custom_col1"],
                   meta["custom_col2"],
                   meta["created_time"])

conn.commit()
cursor.close()
conn.close()

四、常见问题排查

  • 自定义元数据列的内部名称可能与显示名称不同,可通过SharePoint站点的/_api/web/lists/getbytitle('库名称')/fields端点查看字段的InternalName属性。
  • 若遇到权限拒绝,检查文档库是否存在权限继承中断,需手动将Azure AD应用添加为库的读取权限用户。
  • 若使用SharePoint REST API,需注意应用权限的格式为client_id@tenant_id,且请求头需包含Authorization: Bearer {token}和Accept: application/json;odata=verbose。

内容的提问来源于stack exchange,提问作者Harry Duffy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:33:16