我们如何使用 Python/Pandas 将数据推送到 Azure SQL 服务器?
How can we use Python/Pandas to push data to Azure SQL Server?
我阅读了下面两个链接中的文档。
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)
代码只有 运行s 和 运行s。它永远不会完成,也永远不会抛出错误。我在这里做错了什么?如果我 运行 在 Azure 中执行下面的脚本,我会看到 0 条记录,即使在几分钟后也是如此。
SELECT TOP (1000) * FROM [dbo].[health]
查询成功:受影响的行数:0
查看下面的代码,将数据发送到 SQL table,它正在工作。
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()
我阅读了下面两个链接中的文档。
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)
代码只有 运行s 和 运行s。它永远不会完成,也永远不会抛出错误。我在这里做错了什么?如果我 运行 在 Azure 中执行下面的脚本,我会看到 0 条记录,即使在几分钟后也是如此。
SELECT TOP (1000) * FROM [dbo].[health]
查询成功:受影响的行数:0
查看下面的代码,将数据发送到 SQL table,它正在工作。
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()