通过 Jupyter Lab 中的 SQL magics 连接到 SQL Server

问题描述 投票:0回答:3

我正在尝试使用 SQL 魔法通过 Jupyter Labs 连接到我们的远程 sql 服务器数据库。 我可以使用传统的连接字符串进行连接,但 SQL 魔法似乎不起作用(这意味着我做错了什么)。 下面是工作的 pyodbc 连接:

conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=Server;'
                      'Database=DB;'
                      'Trusted_Connection=yes;')

但是当我尝试连接魔法时,我收到一条错误,提示未提供连接字符串

%load_ext sql
%sql engine = create_engine("mssql+pyodbc://user:password@server/db")

理想情况下,我想使用 DSN 与 Magics 连接(我也尝试过,但没有成功):

%load_ext sql
%sql engine = create_engine("mssql+pyodbc://DSN;Trusted_Connection = Yes")

对建立连接有帮助吗?

python-3.x sqlalchemy jupyter-lab ipython-magic
3个回答
6
投票

在 Jupyter 单元中尝试此操作:

import urllib
params = urllib.parse.quote_plus("DRIVER={SQL SERVER};SERVER=Server;DATABASE=DB;TRUSTED_CONNECTION=YES")
"mssql+pyodbc:///?odbc_connect=%s" % params

然后运行单元并将从其评估返回的编码字符串复制/粘贴到 magic 中。

%%sql mssql+pyodbc:///?odbc_connect=DRIVER%3D%7BSQL+SERVER%7D%3BSERVER%3DServer%3BDATABASE%3DDB%3BTRUSTED_CONNECTION%3DYES
   [your SQL code here]

4
投票

无需复制粘贴的编程方式是使用大括号:

connection_str = "DRIVER={SQL SERVER};SERVER=Server;DATABASE=DB;TRUSTED_CONNECTION=YES"
connection_str_quoted = urllib.parse.quote_plus(connection_str)
connection_uri = 'mssql+pyodbc:///?odbc_connect={}'.format(connection_str_quoted)

# this is how you would connect in sqlalchemy
import sqlalchemy
conn = sqlalchemy.create_engine(connection_uri)

%sql {connection_uri}

0
投票

总结

看起来您正在尝试将

engine
传递给
%sql
并同时对其进行 assign ,这似乎在 JupySQL (当前支持的 ipython-sql 分支)和ipython-sql。如果您使用 JupySQL 版本的 SqlMagic,则只需将创建的 SQLAlchemy 引擎传递给
%sql
或静态 URL 字符串(该引擎可能更可取)。

JupySQL 目前正在进行持续的支持和维护,并具有其他功能,因此我建议下载 JupySQL 并使用它(自 2022 年起可用)。

请参阅 JupySQL 的文档此处

与其他答案一致,您可以使用 SQLAlchemy 的

URL.create()
方法创建一个 URL,在 他们的文档中指定。

但是要回答您如何正确执行此操作的问题 - 有两种方法,具体取决于您使用 ipython-sql 还是 JupySQL:

ipython-sql

%load_ext sql

from sqlalchemy import URL

url_object = URL.create(
    "mssql+pyodbc",
    username="user",
    password="password",  # plain (unescaped) text
    host="server",
    database="db",
)

engine = sqlalchemy.create_engine(url_object)

%sql $engine
# or
%sql mssql+pyodbc://user:***@server/db

JupySQL

%load_ext sql

from sqlalchemy import URL
from sqlalchemy import 

url_object = URL.create(
    "mssql+pyodbc",
    username="user",
    password="password",  # plain (unescaped) text
    host="server",
    database="db",
)

engine = sqlalchemy.create_engine(url_object)

%sql engine
# or
%sql mssql+pyodbc://user:***@server/db

© www.soinside.com 2019 - 2024. All rights reserved.