0

我正在尝试使用 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 在我的用户帐户下的任务管理器中运行)。但是当我运行时SqlLocalDB.exe info hands-on,输出是

State:              Stopped

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

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

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

4

1 回答 1

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
于 2017-01-20T10:07:12.003 回答