【发布时间】: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