使用pyodbc

时间:2017-06-27 09:57:27

标签: python sql database odbc pyodbc

我有一个程序将一堆数据插入SQL数据库。数据由 Reports 组成,每个 Reports 都有标签

标记有一个字段 report_id ,它是对相关报告的主键的引用。

现在,每次插入数据时,都可以有200个 Reports 甚至更多,每个可能有400个标签。所以在伪代码中,我现在正在这样做:

for report in reports:
    cursor_report = sql('INSERT report...')
    cursor_report.commit()
    report_id = sql('SELECT @@IDENTITY')

    for tag in report:
        cursor_tag += sql('INSERT tag, report_id=report_id')
    cursor_tag.commit()

我不喜欢这个,原因有两个。大多数情况下,我不喜欢SELECT @@IDENTITY声明。

  1. 这不意味着如果另一个进程在正确的时刻插入数据,那么该语句将返回错误的主键吗?
  2. 我希望INSERT report...能够返回插入的主键,这可能吗?
  3. 由于我目前必须在报告之间提交,因此程序会在这些时刻“暂停”。如果我可以在最后提交所有内容,那么它将大大减少花费的时间。我一直在考虑在用于识别的报告中创建一个单独的字段,这样我就可以report_id = (SELECT id FROM reports WHERE seperate_field=?)标签中的某些内容,但这似乎并不优雅。

1 个答案:

答案 0 :(得分:1)

  

这不意味着如果另一个进程在适当的时刻插入数据,那么[" SELECT @@ IDENTITY"]语句会返回错误的主键吗?

没有。数据库引擎跟踪为每个连接插入的最后一个标识值,并返回执行SELECT @@IDENTITY语句的连接的相应值。