【问题标题】:Trying in make insert query using cursor in django and can not get rid off this error TypeError: not all arguments converted during string formatting尝试在 django 中使用光标进行插入查询,但无法摆脱此错误 TypeError: not all arguments convert during string formatting
【发布时间】:2020-01-05 07:43:10
【问题描述】:

我正在尝试在 Django 中使用光标进行插入查询,但此错误表明我搜索了多个解决方案,但没有任何帮助,错误是: sql = sql % tuple('?' * len(params)) TypeError:字符串格式化期间并非所有参数都转换了

我尝试使用 '%s' 而不是 '?'但它没有工作

def insert_DTARFDE2003SYD0827(sourcePE,sourceInterFace,targetPE,targetInterFace):
    params = (sourcePE, sourceInterFace,targetPE,targetInterFace)
    if sourcePE!=None and sourceInterFace!=None and targetPE!=None and targetInterFace!=None:
        sql=" insert into DTA.RFDE2003SYD0827 values ( '?','?',NULL,NULL,NULL,'?','?' "
        with connections['DataAdmin'].cursor() as cursor:
            cursor.execute(sql,params)

我的数据库:

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'Fileade',
        'HOST': '10.238.76.53',
        'USER': 'SDS_dataflow',
        
        'OPTIONS': {
            'driver': 'ODBC Driver 13 for SQL Server',
        }
    
    } ,

    'DataAdmin': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'Data_Admin',
        'HOST': '10.238.76.53',
        'USER': 'SDS_dataflow',
        
        'OPTIONS': {
            'driver': 'ODBC Driver 13 for SQL Server',
        }
}  

} 
Traceback (most recent call last):
  File "C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\College\Orange Training\MassiveMigrationPortalTool\posts\views.py", line 137, in preStepBtn1
    insert_DTARFDE2003SYD0827(sourcePE,targetPE,sourceInterFace,targetInterFace)
  File "D:\College\Orange Training\MassiveMigrationPortalTool\posts\views.py", line 36, in insert_DTARFDE2003SYD0827
    cursor.execute(sql,params)
  File "C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\db\backends\utils.py", line 100, in execute
    return super().execute(sql, params)
  File "C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\db\backends\utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\sql_server\pyodbc\base.py", line 542, in execute
    sql = self.format_sql(sql, params)
  File "C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\sql_server\pyodbc\base.py", line 510, in format_sql
    sql = sql % tuple('?' * len(params))
TypeError: not all arguments converted during string formatting 

【问题讨论】:

  • 请发布完整的回溯,并指定您正在使用的 db-api 连接器(pyodbc、pymssql、其他?)。但在所有情况下,对于符合 db-api 的连接器,不应该引用占位符(db-api 连接器有责任处理正确的引用)。

标签: sql sql-server django django-models


【解决方案1】:

您的错误发生在 django-pyodbc 数据库适配器中(这些模块将 Django 模型与各种 db-api 连接器连接起来)。

As explicitely mentioned in the FineManual,当使用 Django 数据库适配器时,您必须使用 %s 占位符,无论底层 db-api 连接器期望什么 - 这就是 django-pyodbc 尝试替换 %s 的原因占位符(由 django db 适配器 api 预期)与 ?(由底层 pyodbc db-api 连接器预期)。

解决方案很明显:使用预期的%s 占位符。

现在你提到:

我尝试使用 '%s' 而不是 '?'但它没有工作

请注意,“不起作用”是对问题最无用的描述 - 您应该准确地解释如何它“不起作用”。

但无论如何:正如在pyodbc docthe db-api specs 中明确提到的in django documentation 和(我不得不说的更不明确),你不能引用占位符!!! -这就是您尝试使用'%s' 失败的原因。

长话短说:您的 SQL 查询应该是:

sql = "insert into DTA.RFDE2003SYD0827 values (%s, %s, NULL, NULL, NULL, %s, %s)"

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2022-06-18
    • 2022-01-20
    • 2015-12-20
    • 2021-05-12
    相关资源
    最近更新 更多