【问题标题】:Trying to drop table using cursor in django尝试在 django 中使用游标删除表
【发布时间】:2019-09-02 13:48:46
【问题描述】:

我正在尝试使用光标删除表,但它总是说语法错误,尽管我以前使用过它并且工作过但没有删除表

def check_TempTableNames(tableName):
    print(tableName)
    with connections['DataAdmin'].cursor() as cursor:
        print("Check Done")
        cursor.execute("DROP TABLE %s",[tableName]) 

def preStepBtn2(request):
    #empty=Rfde2003Syd0827.objects.using('DataAdmin').all()
    sourcePE = request.GET.get('sourcePE')
    targetPE =request.GET.get('targetPE')
    dropdownConnType =request.GET.get('dropdownConnType')
    sourceInterFace =request.GET.get('sourceInterFace')
    targetInterFace =request.GET.get('targetInterFace') 
    temp_looback = "sop_ce_loopback_interface_" + sourcePE + "_" + targetPE 
    TEMP_ROUTER_STATUS = "sop_ce_router_status_" + sourcePE + "_" + targetPE
    Temp_virtual_int = "sop_ce_virtual_interface_" + sourcePE + "_" + targetPE
    print(temp_looback)
    check_TempTableNames(temp_looback)
    check_TempTableNames(TEMP_ROUTER_STATUS)
    check_TempTableNames(Temp_virtual_int)

我的数据库:

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'Fileade',
        'HOST': '10.238.76.53',
        'USER': 'SDS_dataflow',
        'PASSWORD': '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',
        'PASSWORD': 'SDS_dataflow',

        'OPTIONS': {
            'driver': 'ODBC Driver 13 for SQL Server',
        }
}  

} 

Traceback(最近一次调用最后一次): 文件“C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\core\handlers\exception.py”,第 34 行,在内部 响应 = get_response(请求) _get_response 中的文件“C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\core\handlers\base.py”,第 126 行 response = self.process_exception_by_middleware(e, request) _get_response 中的文件“C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\core\handlers\base.py”,第 124 行 响应 = Wrapped_callback(request, *callback_args, **callback_kwargs) preStepBtn2 中的文件“D:\College\Orange Training\MassiveMigrationPortalTool\posts\views.py”,第 170 行 check_TempTableNames(temp_loopback) 文件“D:\College\Orange Training\MassiveMigrationPortalTool\posts\views.py”,第 147 行,在 check_TempTableNames cursor.execute("DROP TABLE %s;",[tableName]) 文件“C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\db\backends\utils.py”,第 100 行,在执行中 返回 super().execute(sql, 参数) 文件“C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\db\backends\utils.py”,第 68 行,在执行中 return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) _execute_with_wrappers 中的文件“C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\db\backends\utils.py”,第 77 行 返回执行程序(sql,参数,许多,上下文) 文件“C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\db\backends\utils.py”,第 85 行,在 _execute 返回 self.cursor.execute(sql, params) exit 中的文件“C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\db\utils.py”,第 89 行 从 exc_value 提高 dj_exc_value.with_traceback(traceback) 文件“C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\django\db\backends\utils.py”,第 85 行,在 _execute 返回 self.cursor.execute(sql, params) 执行中的文件“C:\Users\Mohammed\Envs\TestEnv\lib\site-packages\sql_server\pyodbc\base.py”,第 546 行 返回 self.cursor.execute(sql, params) django.db.utils.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]'@P1' 附近的语法不正确。(102) (SQLExecDirectW); [42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]无法准备语句。(8180)") [02/Sep/2019 15:43:57] "GET /posts/preStepBtn2?targetInterFace=GE2%2F3%2F4&targetPE=byyc916&sourcePE=byyc815&sourceInterFace=GE4%2F0%2F1&dropdownConnType=Ethernet HTTP/1.1" 500 20592

【问题讨论】:

    标签: sql sql-server django django-models


    【解决方案1】:

    占位符仅用于字段值,您不能在 DDL 语句中使用它们。在这里你必须使用纯字符串格式...

    还有:

    1/ 您绝对不想在 GET 请求上执行此操作。根据 HTTP 规范,GET 请求必须是幂等的,这是有原因的(有一个著名的 DailyWTF 故事,即每次 googlebot 启动时网站的数据库都会被删除......)。

    2/ 您绝对不想信任用户数据,尤其是在数据库操作方面,当这些数据无法被 db-api 清理时更是如此强>。使用 django 表单进行验证和清理,并确保允许执行操作的用户删除那些确切的特定表。

    嗯,是的:“check_xxx”对于实际上删除“xxx”的东西来说是一个非常糟糕的名字。 “clean_temp_tables”或类似的东西可能会使意图更清晰。

    【讨论】:

    • 如何使用纯字符串格式我可以看一个例子吗?
    • @MohammedSaid 我可以建议你做官方 Python 教程吗? docs.python.org/3/tutorial/index.html(假设您使用的是 Python3)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多