【问题标题】:SQLALCHEMY: how to connect to a database when one only knows the DSN?SQLALCHEMY:当一个人只知道 DSN 时如何连接到数据库?
【发布时间】:2017-02-10 16:28:58
【问题描述】:

我有一个简单的连接问题:

有人在我的计算机上安装了正确的 ODBC 驱动程序,到目前为止,我可以使用以下代码连接到我的数据库

import pyodbc
import pandas as pd
import numpy as np

cnxn = pyodbc.connect('DSN=MYDSN')
cnxn.timeout = 3600
cursor = cnxn.cursor()

但是,出于多种原因,我想使用 SQLAlchemy 并使用天真

import sqlalchemy 
engine = sqlalchemy.create_engine('DSN=MYDSN')

惨遭失败。

ArgumentError: 无法从字符串 'DSN=MYDSN' 解析 rfc1738 URL

我在这里找不到正确的语法。我也不知道我的数据库的 url。我在这里失去希望了吗?

谢谢!

【问题讨论】:

  • 您至少需要提供驱动程序名称。见the docs
  • @9000 - 很抱歉挑剔,但不是需要提供 驱动程序名称,因为它是 DSN 定义的一部分。 SQLAlchemy 需要的是 dialect+dbapi_provider,例如,mssql+pyodbc://MYDSN
  • @Noobie - 在 Python 本身中建立 pyodbc 连接后,cnxn.getinfo(pyodbc.SQL_DRIVER_NAME) 返回什么?
  • 该产品似乎不太可能有特定的 SQLAlchemy 方言,因此您可以尝试其中一种现有的方言,看看它是否能给您带来任何乐趣。如果由我决定,我会从mssql+pyodbc://MYDSN 开始。如果做不到这一点,mysql+pyodbc://MYDSN 可能值得一试。 Cisco 也可能有一些资源(可能是知识库和/或论坛?)

标签: python sqlalchemy pyodbc


【解决方案1】:

已经使用“原始”pyodbc 连接来了解 DSN 可能期望与之交谈的内容......

>>> cnxn = pyodbc.connect('DSN=MYDSN')
>>> cnxn.getinfo(pyodbc.SQL_DRIVER_NAME)
'Cisco Information Server 7.0.3 ODBC Driver'

该产品似乎不太可能有特定的 SQLAlchemy 方言。进一步的测试表明,两者

engine = sqlalchemy.create_engine('mssql+pyodbc://MYDSN')

engine = sqlalchemy.create_engine('mysql+pyodbc://MYDSN')

可以连接,但会尝试使用像

这样的 SQLAlchemy 功能
print(engine.table_names())

失败,因为 CIS 不“说”本机 T-SQL 或 MySQL。

您可能仍然可以使用 一些 SQLAlchemy 功能,例如,用于运行基本查询(依赖于相当简单的 SQL 语法)。对于不起作用的 SQLAlchemy 功能,您可以回退到本机 pyodbc。例如,而不是

print(engine.table_names())

你可以使用

cnxn = engine.connect()
crsr = cnxn.cursor()
table_names = [x.table_name for x in crsr.tables(tableType='TABLE')]
print(table_names)

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多