【问题标题】:pyodbc cannot find db id of existing database after another database has been dropped删除另一个数据库后,pyodbc 找不到现有数据库的 db id
【发布时间】:2018-01-03 07:38:10
【问题描述】:

另一个用户正在使用她在 python 会话中创建的数据库,我们称之为 user_db。我在 SSMS 中删除了一个不同的数据库,我们称之为 other_db。在我删除 other_db 后,她的脚本声称他们无法找到 user_db 的 db id。如果她删除 user_db 并重新创建它,问题仍然存在。如果她使用像 new_user_db 这样的新名称,她的脚本会再次运行。

在我看来,unixodbc/freetdbs/pyodbc/python 方面的某些东西正在缓存数据库 ID。谁能告诉我哪些工具可能导致该问题以及可能的解决方案?

错误:

pyodbc.ProgrammingError: ('42000', "[42000] [FreeTDS][SQL Server]找不到数据库 ID (id_number)

编辑: 软件版本 pyodbc——4.0.16 分 - 6.6 unixODBC -- 2.2.14 freeTDS -- 0.91

可通过以下方式重复: 用户 1(在 Python 中):

conn = pyodbc.connect(cxnstring)
cursor = conn.cursor()
cursor.execute('CREATE DATABASE test')
cursor.execute('CREATE DATABASE test_1')
cursor.execute('CREATE TABLE test_1.dbo.test_table (column_1 INT)')
cursor.execute('SELECT * FROM test_1.dbo.test_table')

用户 2(在 SSMS 中):

DROP DATABASE test_1

用户 1(在 Python 中):

conn = pyodbc.connect(cxnstring)
cursor = conn.cursor()
cursor.execute('CREATE DATABASE test_1')
cursor.execute('CREATE TABLE test_1.dbo.test_table (column_1 INT)')
cursor.execute('SELECT * FROM test_1.dbo.test_table')

编辑更正的 SQL 语法

【问题讨论】:

  • 我无法在带有 unixODBC 2.3.1、FreeTDS 0.91 和 pyodbc 4.0.17 的 Ubuntu 16.04 上重现您的问题。请edit 对您正在使用的版本提出问题,并通过minimal reproducible example 说明问题。
  • 在将所有出现的test_1.test_table 替换为test_1..test_table 后,再次尝试您的复制代码。看起来您正在将目录(又名数据库)引用与 qualified object names 中的架构引用混合在一起。
  • 这会引发语法错误,这不是我收到的错误。
  • 不,database_name..object_name 是有效的语法。
  • FWIW,仍然无法在 Xubuntu 16.04 x64 上使用 unixODBC 2.3.1、FreeTDS 1.0.48 和 pyodbc 4.0.17 使用更新的代码(使用 test_1.dbo.test_table)重现该问题。

标签: python sql-server pyodbc freetds unixodbc


【解决方案1】:

我遇到的问题与在数据库最近被另一个连接删除后查询 Information_Schema 有关。每次查询数据库的 Information_Schema 时运行“DBCC FREEPROCCACHE”似乎可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多