Django + pyodbc + MS LocalDB ghost实例

时间:2016-12-27 16:31:00

标签: sql-server django pyodbc localdb sql-server-2014-localdb

我正在尝试使用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并建立了连接。的Presto!

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

State:              Stopped

当我打开SSMS并连接到(LocalDB)\hands-on时,连接正常,但在我的任务管理器中,我现在可以看到第二个 sqlservr.exe正在运行,事实证明我和#39;现在连接。因此,Django / pyodbc和SMSS / SqlLocalDB.exe似乎与同一个LocalDB实例的两个独立实例进行交互,这两个实例都非常乐意报告,称为hands-on

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

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

1 个答案:

答案 0 :(得分:0)

我从未设法找出问题所在,但最终我决定通过在登录时运行一个小脚本来解决问题,该脚本在任何工作完成之前弹出一个LocalDB实例,并设置其自动 - 关闭计时器到高值,这样它就不会被忽视。这是Windows的bat脚本:

"C:\Program Files\Microsoft SQL Server\120\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\ODBC\110\Tools\Binn\SQLCMD.exe" -S (localdb)\MSSQLLocalDB -E -i temp.sql
del temp.sql