Azure Function (python) insert to Azure SQL 不断收到错误

Posted

技术标签:

【中文标题】Azure Function (python) insert to Azure SQL 不断收到错误【英文标题】:Azure Function (python) insert to Azure SQL keep getting an error 【发布时间】:2021-06-19 13:28:54 【问题描述】:

我是 Azure Functions 的新手,遇到了一个我似乎无法克服的错误。 Azure 函数 (Python) 应该从 API 调用中提取数据并将结果插入 Azure SQL 数据库。我正在进行本地调试并不断收到此错误。我已经验证所有列名和数据类型都匹配。任何建议将不胜感激。

感谢您的帮助!!!!

import logging
import requests
import pyodbc
import pandas as pd
import azure.functions as func
from datetime import date
# from azure.identity import DefaultAzureCredential

server = 'xxx' 
database = 'xxx' 
username = 'xxx' 
password = 'xxx' 
cnxn = pyodbc.connect('DRIVER=ODBC Driver 17 for SQL Server;SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()

def get_properties():
    params = 
            'IntegrationPartnerID': 'xxxx',
            'ApiKey': 'xxx',
            'AccountID': 'xxx',
        
    url = 'https://api.myresman.com/Account/GetProperties'

    data=requests.post(url, params)
    response=data.json()

    df=pd.json_normalize(response, record_path='Properties')
    
    df = df.rename(columns='PropertyID':'propertyid', 'Name':'property_name', 'StreetAddress':'street_address', \
    'City':'city', 'State':'state_code', 'Zip':'zip_code', 'Phone':'phone', 'Email':'email', \
        'Manager':'manager','CurrentPeriod.Start': 'currentperiod_start', \
            'CurrentPeriod.End': 'currentperiod_end')
    
    df['propertyid']=df['propertyid'].astype(str)
    df['property_name']=df['property_name'].astype(str)
    df['street_address']=df['street_address'].astype(str)
    df['city']=df['city'].astype(str)
    df['state_code']=df['state_code'].astype(str)
    df['zip_code']=df['zip_code'].astype(str)
    df['phone']=df['phone'].astype(str)
    df['email']=df['email'].astype(str)
    df['manager']=df['manager'].astype(str)
    df['currentperiod_start']=pd.to_datetime(df['currentperiod_start'], format='%Y-%m-%d')
    df['currentperiod_end']=pd.to_datetime(df['currentperiod_end'], format='%Y-%m-%d')
    df['as_of_date']=date.today()
    return df


def main(mytimer: func.TimerRequest) -> None:
    gp_data=get_properties()
    for index, row in gp_data.iterrows():
                cursor.execute("""INSERT INTO dbo.get_properties ('propertyid', 'property_name', 'street_address', 
            'city', 'state_code', 'zip_code', 'phone', 'email', 'manager', 'currentperiod_start', 
                'currentperiod_end') values(?,?,?,?,?,?,?,?,?,?,?,?)""", \
                row.propertyid, row.property_name, row.street_address, row.city, row.state_code, row.zip_code, \
                    row.phone, row.email, row.manager, \
                     row.currentperiod_start, row.currentperiod_end,row.as_of_date)
    cnxn.commit()
    cursor.close()

这是错误:

[2021-03-22T21:05:02.971Z] System.Private.CoreLib:执行函数时出现异常:Functions.get-properties-api-call。 System.Private.CoreLib:结果:失败 异常:ProgrammingError: ('42S22', "[42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名'propertyid'无效。(207) (SQLExecDirectW); [42S22] [Microsoft][ODBC SQL Server 的驱动程序 17][SQL Server]列名“property_name”无效。(207);[42S22][Microsoft][SQL Server 的 ODBC 驱动程序 17][SQL Server]列名“street_address”无效。(207); [42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名“城市”无效。(207);[42S22][Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名无效'state_code'。(207);[42S22][Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名'zip_code'无效。(207);[42S22][Microsoft][ODBC Driver 17 for SQL Server ][SQL Server]列名“电话”无效。(207);[42S22][Microsoft][ODBC 驱动程序 17 for SQL Server][SQL Server]列名“电子邮件”无效。 (207); [42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名“manager”无效。 (207); [42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名“currentperiod_start”无效。 (207); [42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名“currentperiod_end”无效。 (207); [42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]无法准备语句。 (8180)") 堆栈:_handle__invocation_request 中的文件“C:\Program Files\Microsoft\Azure Functions Core Tools\workers\python\3.8/WINDOWS/X64\azure_functions_worker\dispatcher.py”,第 355 行 call_result = 等待 self._loop.run_in_executor( 运行中的文件“C:\Users\marks\AppData\Local\Programs\Python\Python38\lib\concurrent\futures\thread.py”,第 57 行 结果 = self.fn(*self.args, **self.kwargs) _run_sync_func 中的文件“C:\Program Files\Microsoft\Azure Functions Core Tools\workers\python\3.8/WINDOWS/X64\azure_functions_worker\dispatcher.py”,第 542 行 返回函数(**参数) 文件“C:\Users\marks\upwork_files\Taylor\get_properties\get-properties-api-call_init.py”,第 54 行,在 main cursor.execute("""INSERT INTO dbo.get_properties ('propertyid', 'property_name', 'street_address',

【问题讨论】:

在 SQL Server 中 'propertyid' 是一个字符串文字。您可能希望在 INSERT 语句的列列表中使用 propertyid IOW - 只需在插入列表中列出表的名称,不带字符串分隔符。例如,INSERT INTO dbo.get_properties (propertyid, property_name, ... 做到了!!!!非常感谢! @bossjimmark 现在错误解决了吗?我只是帮助他们将其发布为答案,您可以考虑接受它作为答案。这对其他社区成员可能是有益的。谢谢。 【参考方案1】:

非常感谢 AlwaysLearning 和 SMor 的帮助。

在 SQL Server 中,“propertyid”是一个字符串文字。你可能想要 在 INSERT 语句的列列表中使用 propertyid。 IOW - 只需在插入列表中列出您的表的名称,而无需 字符串分隔符。例如,INSERT INTO dbo.get_properties (propertyid, 属性名称,...

这可能对其他社区成员有益。

【讨论】:

以上是关于Azure Function (python) insert to Azure SQL 不断收到错误的主要内容,如果未能解决你的问题,请参考以下文章

Azure Function (python) insert to Azure SQL 不断收到错误

Azure(函数)参数在 Python 中声明,但不在 function.json 中

在 Azure Devops 中为基于 Python 的 Azure Function 设置发布管道的正确方法

为啥 Azure Function V2 中很少有 Python 包不支持?

无法在 Azure Function Python3 中添加 ML 模型

Azure Function App Python Blob 触发器巨大的文件大小