在生产环境中使用Sql Server和Django

52

有没有人最近部署过一个使用SQL Server数据库后端的Django应用程序?我们工作场所非常依赖于SQL Server,如果没有足够完善的后端支持,就不会支持Django。

我知道mssql.django-pyodbc和django-mssql作为非官方支持的后端。这两个项目似乎只有一个人在贡献,这有点令人担忧,但贡献似乎是比较规律的。

是否有其他受到良好支持的SQL Server后端?我提到的这两个是否足够用于生产环境?你们有什么经验?

7个回答

22

如前所述,django-pyodbc是一个不错的选择。PyODBC可能是Python中最成熟的SQL Server库。

唯一可能会出现问题的是pyodbc对存储过程的支持不太好(虽然可以调用,但无法从中获取结果)。您可以使用pymssql来调用它们,但尽可能避免这样做,因为它不支持标准的DB-API接口,并且可能会受到更改的影响。如果您需要这样做,最好直接使用adodbapi(它包含在python win32软件包中,您可能最终会安装它)。


感谢 adodbapi - 这对我来说是一个新的发现。 - Burhan Khalid
django-mssql使用adodbapi的分支版本,并支持存储过程。 - Manfre
4
您可以通过以下方式调用它们,从SQLServer存储过程中获取结果:cursor.execute('DECLARE @results int;EXEC @results=spMyProc;SELECT @results') - Matthew Plourde
更新:使用Django 2.0+,我成功地使用了django-pyodbc-azure,但是没有使用django-pyodbc。 - Dustin Michels

19

这些天

  • django-mssql:在./manage.py migrate期间出现错误“NoneType not callable”
  • avidal/django-pyodbc:已停止维护。替换为:
    • django-pyodbc:不支持Python 3
    • django-pyodbc-azure:到目前为止适用于我
      • 编辑:似乎已经停止维护。提出125号问题询问状态
      • 编辑:从维护者那里得到回复。很快将与Django 2.0更新
      • 编辑:维护者发布了Django 2.0的2.0版本
      • 编辑:维护者发布了Django 2.1的2.1版本

编辑:以下是软件包版本

Django==1.11.6
django-mssql==1.8
pyodbc==4.0.19
django-pyodbc==1.1.1
django-pyodbc-azure==1.11.0.0

4
提供您测试过的Django和库的版本将非常有帮助,因为这些信息可能很快过时。 - Josh Smeaton
还要注意,django-pyodbc及其分支在Linux上运行--与django-mssql不同,它没有Windows依赖项。SQL Server甚至不再需要Windows,所以这在未来可能会变得越来越重要。 - lehiester

11

以下是针对此问题的“现代”答案。我成功地将 Django 1.11 部署到一个生产 Ubuntu 16.04 服务器上,它连接到运行在另一台服务器上的 MS SQL Server 2017。

首先,安装本机 MS ODBC 驱动程序“ODBC Driver 17 for SQL Server”:

# https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server#ubuntu-1404-1604-and-1710
sudo su
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
apt-get update
ACCEPT_EULA=Y apt-get install msodbcsql
apt-get install unixodbc-dev

# test you can actually get to port 1433 on the server that is running MS SQL:
nc -z -v -w5 host.where.sql.server.is.running.com 1433

# add /opt/mssql-tools/bin to your PATH in .bash_profile, e.g.:
# PATH="$HOME/bin:$HOME/.local/bin:/opt/mssql-tools/bin:$PATH"
# source ~/.bash_profile
# now, test that you can actually connect to MS SQL Server:
sqlcmd -S host.where.sql.server.is.running.com -U db_username -P db_password

其次,请确保您使用 pip install 安装了这些模块:

# https://github.com/michiya/django-pyodbc-azure
django-pyodbc-azure==1.11.9.0

# https://github.com/mkleehammer/pyodbc/wiki
pyodbc==4.0.22

第三步,修改您的Django settings.py中的DATABASES入口:

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'db_name',
        'USER': 'db_username',
        'PASSWORD': 'db_password',
        'HOST': 'host.where.sql.server.is.running.com',
        'PORT': '1433',
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'isolation_level': 'READ UNCOMMITTED',  # prevent SELECT deadlocks
        },
    },
}

我忽略了我的其他配置(nginx、Gunicorn、Django REST Framework等),但这超出了本答案的范围。

更新:这已经在生产环境中运行了6个月以上,除了MS SQL Server特定的死锁问题外,在同一张表上进行多个连接的SELECT查询时没有遇到任何问题,这个问题通过isolation_level设置得以解决。该系统每天会有大约2k个新用户。


@ianbroad - 是的,这仍在生产中运行,但它仍然是我列出的相同版本。我还没有在MacOS Mojave上尝试过它。 - Cloud Artisans
@ianbroad 你需要为libs做一些符号链接吗?我正在使用ODBC 17驱动程序,但是出现了这个错误。谢谢django.core.exceptions.ImproperlyConfigured: 加载pyodbc模块时出错:libodbc.so.2:无法打开共享对象文件:没有那个文件或目录 - ray

4
我们公司在生产中使用django-mssql。我们之前也有一个使用mssql的现有系统。对于我个人来说,这是我做过的最好的设计决策之一,因为现在我可以使用django,我的生产力显著提高了。
我提交了一个补丁,但是当我开始使用django-mssql并进行了一两周的测试后。从那时起(2008年10月)我们就在django上运行我们的系统,并且它运行得非常稳定。我也尝试过pyodbc,但我不太喜欢。
我们正在运行一个维修系统,所有交易都通过该系统处理,共有40个重度用户。如果您有更多问题,请告诉我。

django-mssql 是否与特定版本的 Django 相关联? - Josh Smeaton
8
django-mssql要求在Windows上运行django。如果在Linux上运行django该怎么办? - IgorGanapolsky
@Paul,我有一个现有的Sybase数据库,我想连接Django进行仅选择报告。我可以使用django-mssql直接连接到DSN吗? - ctrl-alt-delete

4
我看到很多人在Windows上安装了django_mssql之后遇到以下错误:
django.core.exceptions.ImproperlyConfigured: 'sqlserver_ado'不是可用的数据库后端。
请尝试使用django.db.backends.XXX,其中XXX是以下之一:
'dummy','mysql','oracle','postgresql_psycopg2','sqlite3'
错误为:没有名为sqlserver_ado.base的模块
解决方法是安装以下插件:

http://sourceforge.net/projects/pywin32/


1
我现在正在遇到这个确切的错误,链接不再有效,你知道我可以从哪里获取插件吗? - David Zhan Liu
1
@DavidZhanLiu:根据网络档案,那是Python Win32扩展。它已经迁移到http://sourceforge.net/projects/pywin32/。 - SaeX

2
使用下面的官方Microsoft包将SQL服务器连接到Django。
pip install mssql-django

设置

 DATABASES = {
    'default': {
        'ENGINE': 'mssql',
        'NAME': 'mydb',
        'USER': 'user@myserver',
        'PASSWORD': 'password',
        'HOST': 'myserver.database.windows.net',
        'PORT': '',

        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
        },
    },
}

# set this to False if you want to turn off pyodbc's connection pooling
DATABASE_CONNECTION_POOLING = False

更多信息: https://github.com/microsoft/mssql-django


1
我还没有在生产环境中使用过它,但是我对django-mssql的初步体验非常不错。你只需要安装Python Win32扩展并将sqlserver_ado模块添加到Python路径中即可。从那里开始,你只需将sql_server.pyodbc用作DATABASE_ENGINE。到目前为止,我还没有注意到任何缺失,但我也还没有完全测试过它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接