将Python连接到远程SQL Server

4

我正在尝试将Python连接到我们的远程SQL Server,但是我无法成功。以下是我使用的代码。

 server = 'server,1433' 
 database = 'db' 
 username = 'username' 
 password = 'pw' 
 cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
 cursor = cnxn.cursor()
 cursor.execute('SELECT top 1 * FROM db.dbo.t_location')
 for row in cursor:
     print(row)

我们有两台服务器,一台是数据库服务器,但我使用应用服务器来连接到数据库服务器的 SQL。这是我遇到的错误。我已经尝试了一个星期,但我不确定我在这里错过了什么。 任何帮助将不胜感激。
操作错误:('08001', '[Microsoft] [ODBC Driver 17 for SQL Server] TCP 提供程序:没有这样的主机\r\n (11001) (SQLDriverConnect); [08001] [Microsoft] [ODBC Driver 17 for SQL Server] 登录超时(0); [08001] [Microsoft] [ODBC Driver 17 for SQL Server] 建立到 SQL Server 的连接时发生特定于网络或实例的错误。找不到服务器或无法访问。检查实例名称是否正确以及是否配置了 SQL Server 以允许远程连接。有关更多信息,请参阅 SQL Server Books Online。(11001)')
已添加:
connection_str = ("Driver={SQL Server Native Client 11.0};"
                  "Server= 10.174.124.12,1433;"
                  #"Port= 1433;"
                  "Database=AAD;"
                  "UID=dom\user;"
                  "PWD=password;"
                  )

connection = pyodbc.connect(connection_str) data = pd.read_sql("select top 1 * from dbo.t_location with (nolock);", connection)

我使用了上述代码,现在出现了这个错误。看起来好像它工作了,但是登录失败了。通常我必须在SSMS中使用Windows身份验证,一旦我输入我的凭据登录远程桌面。

('28000',"[28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user 'dom\user'. (18456) (SQLDriverConnect); [28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user 'dom\user'. (18456)")

回答:

我很高兴终于找到了一个使用pymssql的解决方案。我不知道为什么pyodbc不起作用,但我肯定是做错了什么。我使用以下代码来使用Python从远程SQL服务器获取数据。

import pymssql

conn = pymssql.connect(
    host=r'10.174.124.12',
    user=r'dom\user',
    password=r'password',
    database='db'
)
cursor = conn.cursor(as_dict=True)
cursor.execute('Select top 4 location_id, description from t_location with (nolock)')
data = cursor.fetchall()
data_df = pd.DataFrame(data)

cursor.close()

暂时忽略我的代码。我还需要进行一些清理,但这段代码是可行的。


2
错误信息的重要部分是:服务器未找到或无法访问。首先检查您动态生成的连接字符串,并验证它是否具有正确的信息。如果正确,请尝试连接故障排除程序 - SMor
1
在调试时,请停止在查询中使用三部分名称。连接应该确定数据库。使用三部分名称(例如,DB.SCHEMA.TABLE)会使您的代码更难移植到不同的环境中。 - SMor
我们有两台服务器。其中一台是数据库服务器,但我使用应用服务器来连接数据库服务器的SQL。听起来你正在尝试连接错误的服务器。要进行直接的数据库连接,你需要连接到运行数据库服务器软件的机器上。 - Gord Thompson
2个回答

5

最终回答我的问题,我必须使用pymssql,它有效了。 我不需要加上那个让我困惑的端口号。 感谢大家抽出时间来回答。

import pymssql

conn = pymssql.connect(
    host=r'10.174.124.12',
    user=r'dom\user',
    password=r'password',
    database='db'
)
cursor = conn.cursor(as_dict=True)
cursor.execute('Select top 4 location_id, description from t_location with (nolock)')
data = cursor.fetchall()
data_df = pd.DataFrame(data)

cursor.close()

1
你可以使用这个函数:

def connectSqlServer(Server , Database , Port , User , Password):
    try:
        conn = pyodbc.connect('Driver={SQL Server}; Server='+Server+'; 
Database='+Database+'; Port='+Port+'; UID='+User+'; PWD='+Password+';')
        cursor = conn.cursor()


except Exception as e:
    print("An error occurred when connecting to DB, error details: {}".format(e))
    return False, None
else:
    return True, cursor

嗨 @Abdulmohsen,我试了你的函数但是得到了同样的错误。在尝试连接到远程SQL服务器时,有没有什么特定的步骤我应该记住? - hkay
@HabibKhan 你好,你能使用ssms连接到你的数据库吗?看起来是一个与网络相关的问题,很可能是端口1433没有对你的数据库服务器开放。 - Abdulmohsen Almasoud
谢谢回复,非常感激。是的,当我打开SSMS时,它似乎工作正常。我认为问题可能是端口或防火墙的原因。我会四处查找并看看是否还能找到其他解决办法。 - hkay
返回的类型是元组,所以可以像这样使用它:cursor = connectSqlServer(.,"Adventureworks2019","1433","User","Pass")[1] - MarmiK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接