sqlalchemy,用DSN指定数据库名

sqlalchemy, specify database name with DSN

我正在尝试使用 sqlalchemy 从 Linux 连接到 SQL 服务器。 This page 显示基于 DSN 的连接如下。

engine = create_engine("mssql+pyodbc://scott:tiger@some_dsn")

有没有办法使用 DSN 指定数据库名称?我知道我们可以在 odbc.ini 或 SQL 查询中指定数据库名称,但我想知道我们是否也可以这样做。

engine = create_engine("mssql+pyodbc://scott:tiger@some_dsn/databasename")

我刚试过这样的东西,它似乎工作正常

engine = create_engine("mssql+pyodbc://scott:tiger@some_dsn")
with engine.begin() as conn:
    conn.execute("USE databasename")

作为一般规则,我们在建立连接后更改当前目录(a.k.a。“数据库”)时应该小心,因为某些技术(例如,JDBC Connection 对象) 跟踪当前目录,如果我们直接在 T-SQL 中调用 USE ... 来更改当前目录,可能会感到困惑。但是,我不知道 pyodbc 的 Connection 对象会进行任何此类缓存,因此这种方法可能没问题。

您可以通过 create_engine 中的 connect_args 参数将参数直接传递给 pyodbc.connect 方法:

def my_create_engine(mydsn, mydatabase, **kwargs):
    connection_string = 'mssql+pyodbc://@%s' % mydsn
    cargs = {'database': mydatabase}
    cargs.update(**kwargs)
    e = sqla.create_engine(connection_string, connect_args=cargs)
    return e

这还将使数据库能够通过多个事务/会话持久化。