【问题标题】:How do I connect to SQL Server via sqlalchemy using Windows Authentication?如何使用 Windows 身份验证通过 sqlalchemy 连接到 SQL Server?
【发布时间】:2014-07-27 22:21:43
【问题描述】:

sqlalchemy,一个用于 Python 的数据库连接模块,默认使用 SQL 身份验证(数据库定义的用户帐户)。如果您想使用您的 Windows(域或本地)凭据向 SQL Server 进行身份验证,则必须更改连接字符串。

默认情况下,按照sqlalchemy的定义,连接SQL Server的连接字符串如下:

sqlalchemy.create_engine('mssql://*username*:*password*@*server_name*/*database_name*')

如果使用您的 Windows 凭据,这将引发类似于此的错误:

sqlalchemy.exc.DBAPIError: (Error) ('28000', "[28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for us
er '***S\\username'. (18456) (SQLDriverConnect); [28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for us
er '***S\\username'. (18456)") None None

在此错误消息中,代码 18456 标识 SQL Server 本身引发的错误消息。此错误表示凭据不正确。

【问题讨论】:

    标签: python sql-server sqlalchemy


    【解决方案1】:

    为了在 sqlalchemy 和 mssql 中使用 Windows 身份验证,需要以下连接字符串:

    ODBC 驱动程序:

    engine = sqlalchemy.create_engine('mssql://*server_name*/*database_name*?trusted_connection=yes')
    

    SQL Express 实例:

    engine = sqlalchemy.create_engine('mssql://*server_name*\\SQLEXPRESS/*database_name*?trusted_connection=yes') 
    

    【讨论】:

    • 如果我们从使用 Windows 凭据登录的机器上运行脚本,上述连接字符串可能会很有用。如果我需要从其他主机运行脚本怎么办?
    • 这正是我现在正在处理的问题 - 到目前为止,我遇到了错误。
    • 不幸的是,这对我不起作用,但它让我走上了正确的道路。这是我必须使用的:sqlcon = create_engine('mssql+pyodbc://@' + servername + '/' + dbname + '?trusted_connection=yes&driver=ODBC+Driver+13+for+SQL+Server')
    • @DoloMike 是的,这个答案已经过时了。
    • @DoloMike 我希望我能给你的帖子投票 10,000 次以上。
    【解决方案2】:

    如果您使用的是受信任的连接/AD 而不是用户名/密码,或者请参阅以下内容:

    SAWarning:未指定驱动程序名称;这是 PyODBC 在使用 >DSN-less 连接时所期望的 "未指定驱动程序名称;"

    那么这个方法应该可以工作了:

    from sqlalchemy import create_engine
    
    server = <your_server_name>
    
    database = <your_database_name>
    
    engine = create_engine('mssql+pyodbc://' + server + '/' + database + '?trusted_connection=yes&driver=ODBC+Driver+13+for+SQL+Server')
    

    【讨论】:

      【解决方案3】:

      如果您想从 与您在 Windows 上登录的用户不同 的用户连接到 MSSQL DB,请提供更新的响应。如果您从安装了 FreeTDS 的 Linux 计算机 连接,它也可以正常工作。

      以下内容适用于我在 Windows 10 和 Ubuntu 18.04 上使用 Python 3.6 和 3.7:

      import getpass
      from sqlalchemy import create_engine
      password = getpass.getpass()
      eng_str = fr'mssql+pymssql://{domain}\{username}:{password}@{hostip}/{db}'
      engine = create_engine(eng_str)
      

      更改的是在\username 之前添加Windows domain。 您需要安装 pymssql 软件包。

      【讨论】:

        【解决方案4】:

        pyodbc

        我认为你需要输入:

        "+pyodbc" 在 mssql 之后

        试试这个:

        from sqlalchemy import create_engine
        
        engine = create_engine("mssql+pyodbc://user:password@host:port/databasename?driver=ODBC+Driver+17+for+SQL+Server")
        
        cnxn = engine.connect()
        

        对我有用

        好运!

        【讨论】:

        • 这并没有回答有关使用“Windows 身份验证”的问题,尽管您需要将 pyodbc 作为连接字符串的一部分。
        【解决方案5】:

        创建您的 SqlAlchemy 连接 URL
             从您的 pyodbc 连接字符串
             或您已知的连接参数

        我发现所有其他答案都具有教育意义,我发现连接字符串上的 SqlAlchemy Docs 也很有帮助,但我一直无法连接到 MS SQL Server Express 19,我没有使用用户名或密码,并且 trust_connection='是的'(此时只是在做开发)。

        然后我在 SqlAlchemy Docs on Connection URLs 中找到了THIS 方法,该方法是由 pyodbc 连接字符串(或只是一个连接字符串)构建的,它也是由已知的连接参数构建的(即,这可以简单地被认为是一个连接在 pyodbc 中不一定使用的字符串)。因为我知道我的 pyodbc 连接字符串正在工作,所以这似乎对我有用,而且确实有效!

        此方法消除了为您提供给 SqlAlchemy create_engine 方法的内容创建正确格式的猜测。如果您知道您的连接参数,您可以按照下面代码示例的文档将它们放入一个简单的字符串中,并且 sqlalchemy.engine 模块的 URL 类中的 create 方法会为您执行正确的格式。

        下面的示例代码按原样运行,并假定一个名为 ma​​ster 的数据库和一个名为 table_one 的现有表,其架构如下所示。另外,我正在使用 pandas 导入我的表数据。否则,我们希望使用上下文管理器来管理与数据库的连接,然后像 SqlAlchemy 文档中的 HERE 那样关闭连接。

        import pandas as pd
        import sqlalchemy
        from sqlalchemy.engine import URL
        
        # table_one dictionary:
        table_one = {'name': 'table_one',
            'columns': ['ident int IDENTITY(1,1) PRIMARY KEY',
                'value_1 int NOT NULL',
                'value_2 int NOT NULL']}
        
        # pyodbc stuff for MS SQL Server Express
        driver='{SQL Server}'
        server='localhost\SQLEXPRESS'
        database='master'
        trusted_connection='yes'
        
        # pyodbc connection string
        connection_string = f'DRIVER={driver};SERVER={server};'
        connection_string += f'DATABASE={database};'
        connection_string += f'TRUSTED_CONNECTION={trusted_connection}'
        
        # create sqlalchemy engine connection URL
        connection_url = URL.create(
            "mssql+pyodbc", query={"odbc_connect": connection_string})
        
        """ more code not shown that uses pyodbc without sqlalchemy """
        
        engine = sqlalchemy.create_engine(connection_url)
        
        d = {'value_1': [1, 2], 'value_2': [3, 4]}
        df = pd.DataFrame(data=d)
        
        df.to_sql('table_one', engine, if_exists="append", index=False)
        

        更新

        假设您已在 linux 机器上安装了 SQL Server Express。您可以使用以下命令来确保您使用正确的字符串:

        1. 司机:odbcinst -q -d
        2. 对于服务器:sqlcmd -S localhost -U &lt;username&gt; -P &lt;password&gt; -Q 'select @@SERVERNAME'

        【讨论】:

        • 为了解释你的 URL.create 函数,添加更多细节可能是值得的。例如,您可以使用以下内容:url = URL.create("mssql+pyodbc" , host='servername' , database="database Name" , query={"Trusted_Connection":'yes',"driver":"ODBC SQL Server 驱动程序 17"})
        • 请注意,查询适用于 ? 之后的所有内容在网址中。命名参数在此之前使用所需的信息。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-07
        • 1970-01-01
        • 2013-09-07
        • 2020-09-30
        相关资源
        最近更新 更多