Django + pyodbc + MS LocalDB ghost 实例

Django + pyodbc + MS LocalDB ghost instance

我正在尝试使用 LocalDB 实例设置一个 Python 项目。由于业务限制,我绑定到 MS SQL Server 2014 后端以与 Django 1.8 一起使用,并且我正在尝试使用 pyodbc 驱动程序连接到它。我想使用 LocalDB 实例而不是 SQL 服务器进行开发,但我遇到了一些问题 运行。我的连接使用以下设置。

Django 设置:

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'my_db',
        'HOST': '(localdb)\hands-on',
        'Trusted_Connection': 'yes',
        'PORT': '',
        'OPTIONS': {'driver': 'SQL Server Native Client 11.0',
                    'Integrated Security': 'true',
                    },
        'TEST': {
            'NAME': 'test_my_db',
        },
    }
}

我用 SqlLocalDB.exe:

创建了这个实例
Name:               hands-on
Version:            12.0.2000.8
Shared name:
Owner:              COMPANY\MY_ACCOUNT
Auto-create:        No
State:              Stopped
Last start time:    27-12-2016 16:53:55
Instance pipe name:

我使用 SSMS 在实例中创建了 my_db 并建立了连接。急!

但是,有一点问题。当我启动 Django 应用程序时,它会自动启动 LocalDB 实例(我可以在我的用户帐户下的任务管理器中看到 sqlservr.exe 运行ning)。但是当我运行SqlLocalDB.exe info hands-on时,输出是

State:              Stopped

当我打开 SSMS 并连接到 (LocalDB)\hands-on 时,连接正常,但在我的任务管理器中我现在可以看到 second sqlservr.exe 运行ning,事实证明我现在已经连接上了。所以 Django / pyodbc 和 SMSS / SqlLocalDB.exe 似乎以某种方式与同一 LocalDB 实例的两个独立实例进行交互,这两个实例都非常乐意报告称为 hands-on.

我找到了一个解决方法,包括删除 LocalDB 实例及其文件,然后重新创建并使用 SqlLocalDB.exe 启动它,然后才使用我的 Django 应用程序连接到它。然后所有软件似乎都与同一个实例交互,只有一个 sqlservr.exe 进程是 运行ning。可悲的是,这种变通办法有一个很大的缺点,那就是一旦你犯了一个错误就不再工作了,运行 Django before SqlLocalDB.exe start hands-on。然后重新创建 ghost 实例,从那一刻起,Django 会一直连接到它,即使你杀死了实例,用 SqlLocalDB 启动它,然后重新连接 Django;幽灵实例将再次出现。所以这个解决方法非常脆弱,我很难去推荐给我的同事。

有人知道发生了什么事以及如何解决问题吗?除了不尝试结合 Django 和 SQL 服务器,我的意思是 :p

我从来没有设法找出问题所在,但最后我决定通过 运行 登录时的一个小脚本来解决这个问题,该脚本会在完成任何工作之前弹出一个 LocalDB 实例, 并将其 auto-shutdown 计时器设置为高值,这样它就不会在不被注意的情况下自行关闭。这是 Windows:

的 bat 脚本
"C:\Program Files\Microsoft SQL Server0\Tools\Binn\SqlLocalDB.exe" s MSSQLLocalDB

@ECHO OFF

ECHO. > temp.sql
ECHO sp_configure 'show advanced options', 1; >> temp.sql
ECHO GO >> temp.sql
ECHO RECONFIGURE >> temp.sql
ECHO GO >> temp.sql
ECHO sp_configure 'user instance timeout', 65000; >> temp.sql
ECHO GO >> temp.sql
ECHO RECONFIGURE >> temp.sql
ECHO GO >> temp.sql
ECHO EXIT >> temp.sql

ECHO.
"C:\Program Files\Microsoft SQL Server\Client SDK\ODBC0\Tools\Binn\SQLCMD.exe" -S (localdb)\MSSQLLocalDB -E -i temp.sql
del temp.sql