【问题标题】:sqlalchemy, specify database name with DSNsqlalchemy,用 DSN 指定数据库名称
【发布时间】:2018-01-10 03:19:45
【问题描述】:

我正在尝试使用sqlalchemy 从 Linux 连接到 SQL Server。 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")

【问题讨论】:

  • 您是否尝试过在使用普通 DSN 语法调用 engine_create 后立即执行 engine.execute("USE databasename")
  • 哇,这太棒了!我没想过为此使用 SQL。您能否将此作为“答案”而不是“评论”,以便我可以选择此作为解决方案?

标签: python sql-server sqlalchemy pyodbc


【解决方案1】:

您可以通过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

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

【讨论】:

    【解决方案2】:

    我刚刚尝试了类似的方法,它似乎工作正常

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

    作为一般规则,我们应该小心在建立连接后更改当前目录(也称为“数据库”),因为某些技术(例如,JDBC Connection 对象)会跟踪当前目录,如果我们这样做可能会混淆直接在T-SQL中调用USE ...改变当前目录。但是,我不知道 pyodbc 的 Connection 对象会执行任何此类缓存,因此这种方法可能还可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 2020-02-14
      • 2018-09-09
      • 2011-07-17
      相关资源
      最近更新 更多