【问题标题】:Python and SQL Bulk InsertPython 和 SQL 批量插入
【发布时间】:2012-12-27 12:04:40
【问题描述】:

我正在使用 IronPython 创建一个数据数组,我需要将此数组插入 MS SQL Server。 我使用的 .Net 类是 SqlBulkCopy(System.Data.SqlClient 的一部分)。

我发现这篇 StackOverflow 文章非常有用SqlBulkCopy from a list

但是,由于我才刚刚开始学习 python,所以我很难用 Python 代码重新创建这个 C# 示例。

这是我目前所拥有的

import clr
clr.AddReference('System.Data')
from System.Data import *

import clr
clr.AddReference('System')
from System import *

sqlDbConnection = SqlClient.SqlConnection("<my-db-connection-string>")
sqlDbConnection.Open()

myDataArray = [
[Byte(7), Byte(8), Int32(1), Byte(15), Byte(12), Single(0.34324)],
[Byte(5), Byte(1), Int32(2), Byte(11), Byte(10), Single(0.77362)],
[Byte(9), Byte(2), Int32(3), Byte(12), Byte(9), Single(0.93394)]]

sqlDbConnection.Close()

这个想法是生成一个大型数据数组(比如 > 100 万行)并使用批量复制方法将其导入我的表中。如果有人能对此有所了解并解释我如何解决这个问题以及如何利用批量复制类附带的所有选项,我将不胜感激。 SqlBulkCopy msdn reference

我一直在寻找有用的 Python 示例,但目前没有找到任何...

非常感谢

【问题讨论】:

  • 这仍然相关还是您自己设法解决了?我看到了stackoverflow.com/questions/14056891/…,您在 F# 中发布了类似任务。
  • 我也设法解决了这个问题,我很快就会发布答案

标签: python .net sql-server ironpython sqlbulkcopy


【解决方案1】:

终于明白了这个问题,希望这会有所帮助:

import clr
clr.AddReference('System.Data')
from System.Data import SqlClient
from System.Data import *
from System.Data import DataTable

import clr
clr.AddReference('System')
from System import *
from System import Console
from System import Data

sqlConnectionString = "<sql-connection-string>"
sqlDbConnection = SqlClient.SqlConnection(sqlConnectionString)
sqlDbConnection.Open()

workTable = DataTable()
workTable.Columns.Add("Col1", Byte)
workTable.Columns.Add("Col2",Byte)
workTable.Columns.Add("Col3", Int32)
workTable.Columns.Add("Col4", Byte)
workTable.Columns.Add("Col5", Byte)
workTable.Columns.Add("Col6", Single)

sampleArray = [Byte(7), Byte(8), Int32(1), Byte(15), Byte(12), Single(0.34324)] 
for i in range (0, 189000) :
  workTable.Rows.Add(Array[object](sampleArray))

cmd = SqlClient.SqlCommand("truncate table dbo.MyTable", sqlDbConnection);
def bulkLoadEsgData (): 
    sbc = SqlClient.SqlBulkCopy(sqlConnectionString, SqlClient.SqlBulkCopyOptions.TableLock, BulkCopyTimeout=0, DestinationTableName="dbo.MyTable")
    sbc.WriteToServer(workTable)

# Start simulation
Console.WriteLine("Enter number of simulations (1 simulation = 189,000 data rows):"+"\n")
strN = Console.ReadLine()

n = int(strN)
cmd.ExecuteNonQuery()
for i in range (0, n):
    bulkLoadEsgData()

sqlDbConnection.Close()
Environment.Exit(1111)

【讨论】:

  • 您介意改进您的代码示例以供将来参考吗?您应该使用 with 正确释放 IDisposable 资源(至少对于 SqlBulkCopy 对象,如果可能,对于 SqlConnection 和 SqlCommand),以避免泄漏等。我也会在这样的代码示例中避免 Environment.Exit 因为这个在托管场景中可能是一个粗略的终止和中断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2016-01-31
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多