操作数类型与参数化更新查询冲突

2024-06-08 18:11:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含以下列的SQL Server表(*表示允许空值):

  • ID(内景)
  • 请购单ID(int)
  • 应用程序ID(int)
  • 工作流状态ID(int)
  • 工作流日期(日期时间)
  • 提交日期(日期时间)
  • 开始日期(日期)*
  • 处置ID(int)*
  • ATS应用程序ID(varchar(255))*
  • 应用程序链接(varchar(255))*
  • CreateDate(日期时间)
  • 修改日期(日期时间)

我正在尝试使用pypyodbc和Driver=SQL Server(MS SQL Server 2012数据库)进行参数化插入查询。问题如下:

sql_statement = """
    UPDATE [hr].[ATS.Applications] SET RequisitionID = ?, WorkflowStateID = ?, WorkflowDate = ?, StartDate = ?, DispositionID = ?, ModifyDate = ? WHERE ID = ?
    """

cursor.execute(sql_statement,(new_application.requisition_id,
                              new_application.workflow_state,
                              new_application.workflow_date.strftime("%Y-%m-%dT%H:%M:%S"),
                              new_start_date,
                              new_application.disposition,
                              now,
                              old_application.ID))

cursor.commit()

导致以下错误:

^{pr2}$

我假设其中一个日期字符串被解释为计算的整数,但是使用调试器,所有数据和数据类型似乎都与我的表兼容:

new_application.requisition_id = {int} 7
new_application.workflow_state = {int} 19
new_application.workflow_date.strftime("%Y-%m-%dT%H:%M:%S") = {str} '2017-05-09T07:52:13'
new_start_date = {NoneType} None
new_application.disposition = {int} 7
now = {str} '2017-05-09T17:55:27'
old_application.ID = {int} 34402

我尝试将datetime值作为datetime对象和字符串插入,并且 似乎无法解析预期的数据类型。在

你知道我为什么对这个更新声明有意见吗?在


Tags: id应用程序newsqldateserverapplication时间
1条回答
网友
1楼 · 发布于 2024-06-08 18:11:38

pypyodbc处理从Python date/datetime对象到适当的sqlserver数据类型的类型转换,而不是依赖字符串格式。在

在下面的例子中,我假设:

  • new_application.workflow_date是Python日期时间对象
  • ^来自原始问题的{}旨在使用datetime模块获得当前系统时间
sql_statement = """
UPDATE [hr].[ATS.Applications] SET RequisitionID = ?, WorkflowStateID = ?, WorkflowDate = ?, StartDate = ?, DispositionID = ?, ModifyDate = ? WHERE ID = ?
    """

cursor.execute(sql_statement,(new_application.requisition_id,
                              new_application.workflow_state,
                              new_application.workflow_date,
                              new_start_date,
                              new_application.disposition,
                              datetime.now(),
                              old_application.ID))

cursor.commit()

有关包括SQL Server DATETIME类型的支持示例,请参阅我的答案here。在

相关问题 更多 >