使用Python备份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
相关产品推荐
相关产品推荐

