sql-server 使用Python中的SQLAlchemy连接到Azure数据库

zdwk9cvp  于 2022-10-31  发布在  Python
关注(0)|答案(5)|浏览(257)

我正在尝试使用Python中的SQLAlchemy连接到Azure数据库。
我的代码如下:

engine_azure = \
create_engine('mssql+pyodbc://{Server admin login}:{password}@{Server name}.database.windows.net:1433/{AdventureWorksLT}', echo=True)

我收到以下消息:

C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\connectors\pyodbc.py:92: SAWarning: No driver name specified; this is expected by PyODBC when using DSN-less connections
  "No driver name specified; "

然后运行以下代码:

print(engine_azure.table_names())

我收到以下消息:

DBAPIError: (pyodbc.Error) ('01S00', '[01S00] [Microsoft][ODBC Driver Manager] Invalid connection string attribute (0) (SQLDriverConnect)')
1l5u6lss

1l5u6lss1#

您的连接字符串有两个问题:
1.根据SQLAlchemy文档:The delimeters must be URL escaped(当使用传递精确pyodbc字符串时)。
1.也不指定sql驱动程序名称。
您可以使用下面的代码,它在我这边工作得很好:

import pyodbc
from sqlalchemy import create_engine
import urllib

params = urllib.parse.quote_plus \ # urllib.parse.quote_plus for python 3
(r'Driver={ODBC Driver 13 for SQL Server};Server=tcp:yourDBServerName.database.windows.net,1433;Database=dbname;Uid=username@dbserverName;Pwd=xxx;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;')
conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params)
engine_azure = create_engine(conn_str,echo=True)

print('connection is ok')
print(engine_azure.table_names())

检测结果:

对于连接字符串,您可以通过Azure Portal -〉您的数据库-〉连接字符串(在本例中选择ODBC)来获取:

3okqufwl

3okqufwl2#

这是我在Python3中使用的代码:

params = urllib.parse.quote_plus(
    'Driver=%s;' % driver +
    'Server=tcp:%s,1433;' % server +
    'Database=%s;' % database +
    'Uid=%s;' % username +
    'Pwd={%s};' % password +
    'Encrypt=yes;' +
    'TrustServerCertificate=no;' +
    'Connection Timeout=30;')

conn_str = 'mssql+pyodbc:///?odbc_connect=' + params
engine = create_engine(conn_str)
lawou6xi

lawou6xi3#

我在ODBC Driver 17 for SQL Server中使用的Python3代码段。花了我一些时间来弄清楚这一切,特别是驱动程序版本和参数。

import urllib
from sqlalchemy import create_engine

driver = "{ODBC Driver 17 for SQL Server}"
server = "<server-name>.database.windows.net"
database = "<db-name>"
user = "<db-user>"
password = "<db-password>"

conn = f"""Driver={driver};Server=tcp:{server},1433;Database={database};
Uid={user};Pwd={password};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;"""

params = urllib.parse.quote_plus(conn)
conn_str = 'mssql+pyodbc:///?autocommit=true&odbc_connect={}'.format(params)
engine = create_engine(conn_str, echo=True)

engine.execute("SELECT 1")

此外,我需要在macOS上安装以下驱动程序/工具:

brew install msodbcsql17 mssql-tools
sqyvllje

sqyvllje4#

到目前为止,没有一个解决方案对我有效。
相反,我必须指定运行良好的驱动程序({SQL Server})。

params = urllib.parse.quote_plus("DRIVER={SQL Server};SERVER=sqlhost.database.windows.net;DATABASE=pythonSQL;UID=username@sqldb;PWD=password56789")
conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params)
engine_azure = create_engine(conn_str,echo=True)

资料来源:
https://gist.github.com/timmyreilly/f4a351eda5dd45aa9d56411d27573d7c

gwbalxhn

gwbalxhn5#

步骤1:安装Azure SQL DB驱动程序

使用正式文档安装新版本的SQL DB驱动程序:第一个

对先前答案的重大更新:使用最新支持的DB驱动程序版本ODBC Driver 17 for SQL Server,而不是过时的版本ODBC Driver 13 for SQL Server或没有明确定义版本的版本,例如SQL Server

步骤2:安装sqlalchemy package

只需在终端中打印:pip install SQLAlchemy

步骤3:在AzureDbConnection类中 Package 特定的DB逻辑
from dataclasses import dataclass
from typing import Dict, Any, Iterable
from pandas import DataFrame
from sqlalchemy import create_engine, inspect
import urllib

@dataclass(frozen=True)
class ConnectionSettings:
    """Connection Settings."""
    server: str
    database: str
    username: str
    password: str
    driver: str = '{ODBC Driver 18 for SQL Server}'
    timeout: int = 30

class AzureDbConnection:
    """
    Azure SQL database connection.
    """
    def __init__(self, conn_settings: ConnectionSettings, echo: bool = False) -> None:
        conn_params = urllib.parse.quote_plus(
            'Driver=%s;' % conn_settings.driver +
            'Server=tcp:%s.database.windows.net,1433;' % conn_settings.server +
            'Database=%s;' % conn_settings.database +
            'Uid=%s;' % conn_settings.username +
            'Pwd=%s;' % conn_settings.password +
            'Encrypt=yes;' +
            'TrustServerCertificate=no;' +
            'Connection Timeout=%s;' % conn_settings.timeout
        )
        conn_string = f'mssql+pyodbc:///?odbc_connect={conn_params}'

        self.db = create_engine(conn_string, echo=echo)

    def connect(self) -> None:
        """Estimate connection."""
        self.conn = self.db.connect()

    def get_tables(self) -> Iterable[str]:
        """Get list of tables."""
        inspector = inspect(self.db)
        return [t for t in inspector.get_table_names()]

    def dispose(self) -> None:
        """Dispose opened connections."""
        self.conn.close()
        self.db.dispose()

对先前答案的重大更新:不要忘记关闭连接并在不再需要数据库引擎时立即显式地将其丢弃。

享受吧!

使用Azure门户上的Azure DB刀片设置连接设置和凭据:

conn_settings = ConnectionSettings(
    server='<db_server_name>', 
    database='<db_name>', 
    username='<user_name>', 
    password='***')

打开数据库连接:

db_conn = AzureDbConnection(conn_settings)
db_conn.connect()

测试连接(例如,获取可用表列表),执行其他操作,最后关闭连接:

try:
    for t in db_conn.get_tables():
        print(t)
    # Do another DB-related stuff:
    # ...
finally:
    db_conn.dispose()

相关问题