52

有人最近有使用 SQL Server 数据库后端部署 Django 应用程序的经验吗?我们的工作场所在 SQL Server 上投入了大量资金,如果没有足够开发的后端,我们将不支持 Django。

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

是否有任何其他支持良好的 SQL Server 后端?我在这里提到的两个对于生产来说“足够好”了吗?你有什么经验?

4

7 回答 7

22

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

您可能遇到的唯一问题是 pyodbc 不能很好地支持存储过程(您可以调用它们,但您无法从它们中获取结果)。您可以使用 pymssql 调用它们,但我会尽可能避免使用它,因为它不支持标准 DB-API 接口并且可能会发生变化。如果你需要这样做,最好的办法是直接使用adodbapi(它包含在 python win32 包中,你可能最终会安装它)。

于 2009-05-09T15:47:54.473 回答
19

这些日子

  • django-mssql:导致错误“NoneType not callable”./manage.py migrate
  • 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
于 2017-10-31T06:47:01.930 回答
11

这是这个问题的“现代”答案。我在生产 Ubuntu 16.04 服务器上成功部署了 Django 1.11,该服务器连接到在另一台服务器上运行的 MS SQL Server 2017。

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

# https://docs.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 的 DATABASES 条目settings.py

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 框架等),但这超出了这个答案的范围。

更新:这已经在生产中运行了 6 个多月,并且当多个连接在同一个表上执行 SELECT 查询时,除了 MS SQL Server 特定的死锁之外没有任何问题,该isolation_level设置已修复。该系统每天大约有 2000 个新用户。

于 2018-02-16T02:32:59.393 回答
4

我们在公司的生产中使用 django-mssql。我们也有一个使用 mssql 的现有系统。对我个人而言,这是我做过的最好的设计决定,因为现在我可以使用 django 大大提高了我的工作效率。

我提交了一个补丁,但是当我开始使用 django-mssql 并进行了一两周的测试时。从那时起(2008 年 10 月)我们在 django 上运行我们的系统并且它运行稳定。我也试过 pyodbc 但我不太喜欢。

我们正在运行一个修复系统,其中所有事务都通过该系统运行 40 个重度用户。如果您有更多问题,请告诉我。

于 2009-05-09T15:32:45.933 回答
4

我看到很多人django_mssql在 Windows 上安装后收到以下错误:

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/

于 2012-06-08T19:26:50.713 回答
1

还没有在生产中使用它,但是我对 django-mssql 的初步体验非常可靠。您只需要 Python Win32 扩展并将 sqlserver_ado 模块放到您的 Python 路径中。从那里,您只需将sql_server.pyodbc其用作您的DATABASE_ENGINE. 到目前为止,我还没有注意到任何遗漏,但我也没有完全了解它。

于 2009-05-09T15:12:55.733 回答
1

使用以下官方 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

于 2021-09-09T10:44:57.743 回答