如何使用批量插入将数据从 Dataframe 插入到 SQL 服务器 table?
How to use Bulk insert to insert data from Dataframe to SQL Server table?
我是 Python 的新手,所以想寻求帮助。我在 S3 存储桶中有一个 csv 文件,我想使用 Python pyodbc 将此 csv 文件导入到 SQL 服务器中的 table。此文件为 50 MB(400k 条记录)。我的代码如下。正如我下面的代码所述,我的 csv 数据在数据框中,我如何使用批量插入将数据框数据插入 sql 服务器 table。如果我的方法不起作用,请用不同的方法告诉我。
# Connection to S3
s3 = boto3.client(
service_name = 's3',
region_name = 'us-gov-west-1',
aws_access_key_id = 'ZZZZZZZZZZZZZZZZZZ',
aws_secret_access_key = 'AAAAAAAAAAAAAAAAA')
# Connection to SQL Server
server = 'myserver.amazonaws.com'
path = 'folder1/folder2/folder3/myCSVFile.csv'
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE=DB-staging;UID=User132;PWD=XXXXXX')
cursor = cnxn.cursor()
obj_sum = s3.get_object(Bucket = 'my_bucket', Key = path)
csv_data = pd.read_csv(obj_sum['Body'])
df = pd.DataFrame(csv_data, columns = ['SYSTEM_NAME', 'BUCKET_NAME', 'LOCATION', 'FILE_NAME', 'LAST_MOD_DATE', 'FILE_SIZE'])
#print(df.head(n=15).to_string(index=False))
# Insert DataFrame to table
cursor.execute("""truncate table dbo.table1""")
cursor.execute("""BULK INSERT dbo.table1 FROM """ + .....# what do I put here since data is in dataframe??)
我试图遍历数据框,插入 5k 条记录花了 20 分钟。下面的代码。遍历每条记录是一种选择,但效果不佳。这就是为什么我尽可能转向批量插入。
for i in df.itertuples(index = False):
if i.FILE_SIZE != 0:
cursor.execute("""insert into dbo.table1 (SYSTEM_NAME, BUCKET_NAME, X_LOCATION, FILE_NAME, LAST_MOD_DATE, FILE_SIZE)
values (?,?,?,?,?,?)""", i.SYSTEM_NAME, i.BUCKET_NAME, i.LOCATION, i.FILE_NAME, i.LAST_MOD_DATE, i.FILE_SIZE)
最后,奖金问题......我想检查我的数据框中的“FILE_SIZE”列是否等于 0,如果它跳过该记录并前进到下一条记录。
谢谢你的提前。
感谢您的帮助。
使用 fast_executemany = True 为我完成了工作。
engine = sal.create_engine("mssql+pyodbc://username:password@"+server+":1433/db-name?driver=ODBC+Driver+17+for+SQL+Server?Trusted_Connection=yes",
fast_executemany = True)
conn = engine.connect()
我不得不更改我的代码以使用“sqlalchemy”,但它现在运行良好。
调用函数上传数据到SQL服务器如下:
df.to_sql(str, con = engine, index = False, if_exists = 'replace')
我是 Python 的新手,所以想寻求帮助。我在 S3 存储桶中有一个 csv 文件,我想使用 Python pyodbc 将此 csv 文件导入到 SQL 服务器中的 table。此文件为 50 MB(400k 条记录)。我的代码如下。正如我下面的代码所述,我的 csv 数据在数据框中,我如何使用批量插入将数据框数据插入 sql 服务器 table。如果我的方法不起作用,请用不同的方法告诉我。
# Connection to S3
s3 = boto3.client(
service_name = 's3',
region_name = 'us-gov-west-1',
aws_access_key_id = 'ZZZZZZZZZZZZZZZZZZ',
aws_secret_access_key = 'AAAAAAAAAAAAAAAAA')
# Connection to SQL Server
server = 'myserver.amazonaws.com'
path = 'folder1/folder2/folder3/myCSVFile.csv'
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE=DB-staging;UID=User132;PWD=XXXXXX')
cursor = cnxn.cursor()
obj_sum = s3.get_object(Bucket = 'my_bucket', Key = path)
csv_data = pd.read_csv(obj_sum['Body'])
df = pd.DataFrame(csv_data, columns = ['SYSTEM_NAME', 'BUCKET_NAME', 'LOCATION', 'FILE_NAME', 'LAST_MOD_DATE', 'FILE_SIZE'])
#print(df.head(n=15).to_string(index=False))
# Insert DataFrame to table
cursor.execute("""truncate table dbo.table1""")
cursor.execute("""BULK INSERT dbo.table1 FROM """ + .....# what do I put here since data is in dataframe??)
我试图遍历数据框,插入 5k 条记录花了 20 分钟。下面的代码。遍历每条记录是一种选择,但效果不佳。这就是为什么我尽可能转向批量插入。
for i in df.itertuples(index = False):
if i.FILE_SIZE != 0:
cursor.execute("""insert into dbo.table1 (SYSTEM_NAME, BUCKET_NAME, X_LOCATION, FILE_NAME, LAST_MOD_DATE, FILE_SIZE)
values (?,?,?,?,?,?)""", i.SYSTEM_NAME, i.BUCKET_NAME, i.LOCATION, i.FILE_NAME, i.LAST_MOD_DATE, i.FILE_SIZE)
最后,奖金问题......我想检查我的数据框中的“FILE_SIZE”列是否等于 0,如果它跳过该记录并前进到下一条记录。
谢谢你的提前。
感谢您的帮助。
使用 fast_executemany = True 为我完成了工作。
engine = sal.create_engine("mssql+pyodbc://username:password@"+server+":1433/db-name?driver=ODBC+Driver+17+for+SQL+Server?Trusted_Connection=yes",
fast_executemany = True)
conn = engine.connect()
我不得不更改我的代码以使用“sqlalchemy”,但它现在运行良好。
调用函数上传数据到SQL服务器如下:
df.to_sql(str, con = engine, index = False, if_exists = 'replace')