SQLALCHEMY:当只知道DSN时如何连接数据库?

时间:2017-02-10 16:28:59

标签: python sqlalchemy pyodbc

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

有人在我的计算机上安装了正确的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。我在这里失去了希望吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

使用“原始”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)