AJR*_*AJR 3 python sql-server bulkinsert pyodbc pandas
我是 Python 新手,所以寻求帮助。我在 S3 存储桶中有一个 csv 文件,我想使用 Python pyodbc 将此 csv 文件导入 SQL 服务器中的表。此文件为 50 MB(40 万条记录)。我的代码如下。正如我的代码如下所述,我的 csv 数据位于数据框中,如何使用批量插入将数据框数据插入到 sql server 表中。如果我的方法不起作用,请用不同的方法建议我。
# 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??)
Run Code Online (Sandbox Code Playgroud)
我尝试遍历数据框,插入 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)
Run Code Online (Sandbox Code Playgroud)
最后,奖金问题......我想检查我的数据框中的“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()
Run Code Online (Sandbox Code Playgroud)
我不得不更改我的代码以使用“sqlalchemy”,但它现在工作得很好。
调用函数将数据上传到 SQL Server 如下:
df.to_sql(str, con = engine, index = False, if_exists = 'replace')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3682 次 |
| 最近记录: |