bsb036 2024-03-01 21:47 采纳率: 43.8%
浏览 7
已结题

使用pyodbc操作SQL数据库

使用pyodbc操作sql数据库,同时往A表和B表中插入信息时,首先会先往A表中插入信息,插入的每条信息都会产生一个自增长的id,然后再往B表中插入信息,将把这个id作为一列插入到B表中,这个id不能为空,用代码如何实现?已经使用了如下的方法,打印出的id都为None。

self.cursor.execute("SELECT SCOPE_IDENTITY()")
id = self.cursor.fetchone()[0]



self.cursor.execute("SELECT @@IDENTITY AS last_id")
id = self.cursor.fetchone().last_id

  • 写回答

21条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-01 21:48
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在使用pyodbc操作SQL Server数据库时,要获取前一次插入操作生成的自增ID(IDENTITY值),应当确保执行顺序正确,并且使用恰当的方法来获取该ID。根据您的描述,您可能需要在插入A表后立即获取自增ID,然后将其用于B表的插入操作。

    以下是一个示例代码片段,展示了如何实现这个过程:

    import pyodbc
    
    # 连接字符串,例如:Driver=...;Server=...;Database=...;UID=...;PWD=...
    cnxn = pyodbc.connect('your_connection_string')
    
    # 创建游标
    cursor = cnxn.cursor()
    
    # 插入数据到A表
    insert_into_A_query = "INSERT INTO A (column1, column2) VALUES (?, ?)"
    params_A = ('value1', 'value2')
    cursor.execute(insert_into_A_query, params_A)
    
    # 提交事务以确保ID立刻生成(对于某些数据库系统这可能是必需的)
    cnxn.commit()
    
    # 获取A表中刚插入记录的自增ID
    get_last_id_query = "SELECT SCOPE_IDENTITY()"
    cursor.execute(get_last_id_query)
    last_inserted_id = cursor.fetchone()[0]
    
    # 确保ID有效并非None
    if last_inserted_id is not None:
        # 插入数据到B表,引用刚获取的ID
        insert_into_B_query = "INSERT INTO B (id_from_A, column3) VALUES (?, ?)"
        params_B = (last_inserted_id, 'value3')
        cursor.execute(insert_into_B_query, params_B)
    
        # 提交事务
        cnxn.commit()
    
    # 关闭游标和连接
    cursor.close()
    cnxn.close()
    

    注意:

    • SCOPE_IDENTITY()函数是针对SQL Server的,它返回当前会话和当前作用域中的最后一个标识符值。
    • 如果你的数据库不支持SCOPE_IDENTITY(), 而是使用@@IDENTITY或其他方法,请对应修改查询语句。
    • 请确保在插入A表之后马上获取ID,并在同一个事务内进行B表的插入操作,避免其他并发操作影响到ID的获取。

    在实际应用中,务必处理可能出现的异常情况,如插入失败、获取ID失败等。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月9日
  • 修改了问题 3月1日
  • 创建了问题 3月1日

悬赏问题

  • ¥15 有没有复现过PFENet的,如何解决?
  • ¥15 FDMA,OFDMA,TDMA 和 CDMA 系统容量对比仿真
  • ¥15 图神经网络的入侵检测
  • ¥15 工业数据采集技术+存储架构推荐
  • ¥15 GPT-SOVITS如何训练少数民族语言支持合成语音
  • ¥20 树莓派4b使用Camera Module 3时出现the system should be configured for the legacy camera stack问题
  • ¥200 GitHub开源程序配置在VScode调试
  • ¥15 爬虫保存的scv文件0kb
  • ¥20 如何实现基于强化学习的带电作业机械臂的运动规划与控制
  • ¥15 使用wpf制作打砖块游戏时遇到的一个Bug