【问题标题】:How can we use Python/Pandas to push data to Azure SQL Server?我们如何使用 Python/Pandas 将数据推送到 Azure SQL Server?
【发布时间】:2022-01-24 13:26:50
【问题描述】:

我阅读了以下两个链接中的文档。

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-set-database-firewall-rule-azure-sql-database?view=azuresqldb-current

https://www.virtual-dba.com/blog/firewalls-database-level-azure-sql/

上周末我刚刚设置了我的防火墙规则,我认为一切看起来都不错。当我运行下面的脚本时,我会从我的笔记本电脑获取开始和结束 IP 地址。

USE [ryan_sql_db]
GO
SELECT * FROM sys.database_firewall_rules

我认为我们在这里很好。现在,我正在尝试使用下面的代码登录 Azure 数据库,遍历文件夹中的多个 CSV 文件,然后将每个文件推送到我的数据库中。

import os
import glob
import pandas as pd
import ntpath

import urllib.parse
params = urllib.parse.quote_plus(
    'Driver=%s;' % '{ODBC Driver 17 for SQL Server}' +
    'Server=%s,1433;' % 'ryan-server.database.windows.net' +
    'Database=%s;' % 'ryan_sql_db' +
    'Uid=%s;' % 'MyUid'  +
    'Pwd={%s};' % 'MyPwd' +
    'Encrypt=no;' +
    'TrustServerCertificate=no;'
    )
    
from sqlalchemy.engine import create_engine
conn_str = 'mssql+pyodbc:///?odbc_connect=' + params
engine = create_engine(conn_str)
        
connection = engine.connect()
connection

    
# specifying the path to csv files
path = 'C:\\Users\\ryans\\Desktop\\test\\'
csvname= ntpath.basename(path)
  
# csv files in the path
files = glob.glob(path + "*.csv")
  
# defining an empty list to store content
df = pd.DataFrame()
content = []
i = 1  

# checking all the csv files in the specified path
for filename in files:
    print(filename)
    df = pd.read_csv(filename, usecols=range(15), header=1)
    df['filename'] = os.path.basename(filename)
    content.append(df)
    df = pd.concat(content, ignore_index=True)  
    print(i)
    df = df.set_index('filename') 
    i = i + 1  

    try:
        df.to_sql('health', engine, if_exists='append', chunksize=100000, method=None,index=False)
    except Exception as e:
        print(e)

代码只是运行和运行。它永远不会完成,也永远不会引发错误。我在这里做错了什么?如果我在 Azure 中运行下面的脚本,我会看到 0 条记录,即使在几分钟后也是如此。

SELECT TOP (1000) * FROM [dbo].[health]

查询成功:受影响的行数:0

【问题讨论】:

  • 尝试将块大小减少到 1,000 并设置 method=multi。您当前的设置是尝试在单个事务中运行 100K 插入语句。
  • 谢谢。我做了你建议的改变;仍然得到同样的东西。它运行,运行,运行,但实际上并没有将任何数据加载到目标表中。我从来没有到达打印异常的行,所以我不知道问题是什么。很奇怪。
  • 我刚刚用一个非常非常小的数据样本淘汰了它。现在,我收到此消息:(此错误的背景:sqlalche.me/e/14/dbapi
  • 事实证明,我的文件中有一些糟糕的数据,这让事情变得很糟糕。当我清理数据,使字符串成为实际字符串并浮动实际浮点数时,一切都按预期工作。我发布的原始代码完全没有问题。感谢您尝试帮助 gvee!

标签: python sql-server python-3.x azure azure-sql-database


【解决方案1】:

查看下面的代码,将数据发送到正在工作的 SQL 表。

    import pyodbc
    import pandas as pd
    
    df = pd.read_csv("c:\\user\\username\department.csv")
    
    server = 'yourservername' 
    database = 'AdventureWorks' 
    username = 'username' 
    password = 'yourpassword' 
    cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
    cursor = cnxn.cursor()
    #Insert Dataframe into SQL Server:
    for index, row in df.iterrows():
         cursor.execute("INSERT INTO HumanResources.DepartmentTest (DepartmentID,Name,GroupName) values(?,?,?)", row.DepartmentID, row.Name, row.GroupName)
    cnxn.commit()
    cursor.close() 

详细解释请参考此official doc

【讨论】:

    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多