将 Django 连接到 MSSQL Server 2012 时出错

Posted

技术标签:

【中文标题】将 Django 连接到 MSSQL Server 2012 时出错【英文标题】:Error connecting Django to MSSQL Server 2012 【发布时间】:2019-03-26 06:46:15 【问题描述】:

在为我当前的 django 项目进行迁移时出错。

下面是 settings.py 文件中编写的用于连接 MSSQL Server 的代码。

DATABASES = 
'default': 
    'ENGINE':'sql_server.pyodbc',
    'NAME':'JTPROD',
    'HOST':'TZACL5X8H1N2\SQLEXPRESS', ##this is my local machine database
    'USER':'xxx', ##ommitted for the post 
    'PASSWORD':'xxx',##ommitted for tht post
    'PORT':'',

    'OPTIONS':
        'provider': 'SQLOLEDB', # Have also tried 'SQLCLI11' and 'SQLCLI10'
        'extra_params': 'DataTypeCompatibility=80',
        'driver':'SQL Server',
             ,
    ,

但是当我运行“python manage.py migrate

时出现以下错误

Traceback(最近一次调用最后一次):文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\backends\base\base.py", 第 216 行,在 ensure_connection self.connect() 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\backends\base\base.py", 第 194 行,连接中 self.connection = self.get_new_connection(conn_params) 文件“C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\sql_server\pyodbc\base.py”, 第 307 行,在 get_new_connection 中 timeout=timeout) pyodbc.OperationalError: ('08001', '[08001] [Microsoft][ODBC SQL Server Driver]既不是 DSN 也不是 SERVER 关键字 提供 (0) (SQLDriverConnect); [08001] [微软] [ODBC SQL 服务器 Driver]无效的连接字符串属性(0)')

上述异常是以下异常的直接原因:

Traceback(最近一次调用最后一次):文件“manage.py”,第 15 行,在 execute_from_command_line(sys.argv) 文件“C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\management__init__.py”, 第 381 行,在 execute_from_command_line utility.execute() 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\management__init__.py", 第 375 行,执行中 self.fetch_command(subcommand).run_from_argv(self.argv) 文件“C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\management\base.py” , 第 316 行,在 run_from_argv self.execute(*args, **cmd_options) 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\management\base.py", 第 353 行,执行中 输出 = self.handle(*args, **options) 文件“C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\management\base.py” , 第 83 行,包裹 res = handle_func(*args, **kwargs) 文件“C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\management\commands\migrate.py” , 第 82 行,在句柄中 executor = MigrationExecutor(connection, self.migration_progress_callback) 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\migrations\executor.py", 第 18 行,在 init 中 self.loader = MigrationLoader(self.connection) 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\migrations\loader.py", 第 49 行,在 init 中 self.build_graph() 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\migrations\loader.py", 第 212 行,在 build_graph self.applied_migrations = recorder.applied_migrations() 文件“C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\migrations\recorder.py”, 第 61 行,在应用迁移中 如果 self.has_table(): 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\migrations\recorder.py", 第 44 行,在 has_table 中 在 self.connection.introspection.table_names(self.connection.cursor())中返回 self.Migration._meta.db_table 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\backends\base\base.py", 第 255 行,在光标中 返回 self._cursor() 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\backends\base\base.py", 第 232 行,在 _cursor 中 self.ensure_connection() 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\backends\base\base.py", 第 216 行,在 ensure_connection self.connect() 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\utils.py", 第 89 行,在 退出 从 exc_value 文件“C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\backends\base\base.py”中提高 dj_exc_value.with_traceback(traceback), 第 216 行,在 ensure_connection self.connect() 文件 "C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\backends\base\base.py", 第 194 行,连接中 self.connection = self.get_new_connection(conn_params) 文件“C:\Users\elukamis\AppData\Local\Programs\Python\Python37-32\lib\site-packages\sql_server\pyodbc\base.py”, 第 307 行,在 get_new_connection 中 timeout=timeout) django.db.utils.OperationalError: ('08001', '[08001] [Microsoft][ODBC SQL Server Driver]既不是 DSN 也不是 SERVER 提供的关键字 (0) (SQLDriverConnect); [08001] [微软] [ODBC SQL 服务器驱动]无效的连接字符串属性(0)')

有人知道我的配置中可能缺少什么吗?

【问题讨论】:

您的'HOST' 键包含反斜杠:'TZACL5X8H1N2\SQLEXPRESS',如果您使用原始字符串文字,该怎么办? r'TZACL5X8H1N2\SQLEXPRESS'. 谢谢,刚刚尝试了您的建议,但遇到了同样的错误 我放的反斜杠是'server\instance' server\instance 仅用于显式命名(有意选择为“命名实例”类型的安装)实例。 default 实例无法以这种方式访问​​。尝试删除\SQLEXPRESS 即使删除 \SQLEXPRESS 后仍然出现相同的错误。 【参考方案1】:

如果您仍在寻找答案,我不确定这是否会对您有所帮助,但当我遇到类似错误时它会帮助我。 SQL Server Express 默认禁用 TCP/IP 连接,但显然需要启用它们才能允许这样的连接。

打开 SQL Server 配置管理器,展开“SQL Server 网络配置”,然后单击“SQLEXPRESS 协议”。假设 TCP/IP 条目显示为已禁用,右键单击该条目并选择属性。在“协议”选项卡上,将“启用”设置为“是”。我还通过在“IPAll”部分(底部)的 TCP 端口字段中输入“1433”来更新“IP 地址”选项卡。然后我在 settings.py DATABASES 配置部分指定了'PORT':'1433',。我不确定这是否必要,但按照这些步骤可以让我的应用成功连接到 SQL Server Express。

【讨论】:

以上是关于将 Django 连接到 MSSQL Server 2012 时出错的主要内容,如果未能解决你的问题,请参考以下文章

django 模型创建连接到 mssql

无法使用 Python 连接到 MSSQL Server 数据库

通过 PDO ODBC 将 PHP 连接到 MSSQL

在 Server 2012 上通过 php 连接到 MSSQL

无法在 Windows 上从 Python 连接到 MSSQL Server

如何从 Ubuntu 18.04 使用 PHP 连接到 MSSQL Server?