【发布时间】:2022-01-24 13:26:50
【问题描述】:
我阅读了以下两个链接中的文档。
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