【问题标题】:Using Sql Server with Django in production在生产中使用 Sql Server 和 Django
【发布时间】:2009-05-09 06:45:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: python sql-server django pyodbc


    【解决方案1】:

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

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

    【讨论】:

    • 感谢adodbapi - 这对我来说是新的。
    • django-mssql 使用 adodbapi 的 fork 并支持存储过程。
    • 您可以通过调用 SQLServer 存储过程来获取结果:cursor.execute('DECLARE @results int;EXEC @results=spMyProc;SELECT @results')
    • 更新:使用 Django 2.0+ 我在django-pyodbc-azure 上取得了成功,但在 django-pyodbc 上没有成功。
    【解决方案2】:

    这些天

    • django-mssql:在./manage.py migrate 上导致错误“NoneType not callable”
    • avidal/django-pyodbc:未维护。取而代之:
      • django-pyodbc: 不支持 python 3
      • django-pyodbc-azure: 到目前为止为我工作
        • 编辑:似乎没有维护。提交issue 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
    

    【讨论】:

    • 提供 Django 版本和您测试的库会很有帮助,因为这些信息可能很快就会过时。
    • 还要注意django-pyodbc 及其分支在Linux 上运行——与django-mssql 不同,它没有Windows 依赖项。 SQL Server 甚至不再需要 Windows,因此将来可能会变得越来越重要。
    【解决方案3】:

    这是这个问题的“现代”答案。我成功地在生产 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
    

    三、修改你的Djangosettings.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 框架等),但这超出了此答案的范围。

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

    【讨论】:

    • 这仍然对您有用吗?我正在尝试在 MacOS Mojave 上进行此设置,但无法连接。我下载了 13.1 和 17 ODBC 驱动程序。当我尝试连接时,我得到: `jango.db.utils.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not找到 (0) (SQLDriverConnect)")
    • @ianbroad - 是的,它仍在生产中运行,但它仍然与我列出的版本相同。我还没有在 MacOS Mojave 上尝试过。
    【解决方案4】:

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

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

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

    【讨论】:

    • django-mssql 是否与特定版本的 django 绑定?
    • django-mssql 要求 django 在 Windows 上运行。如果在 Linux 上运行 django 怎么办?
    • @Paul,我有一个现有的 sybase 数据库,我想将 Django 连接到仅选择报告。我可以使用 django-mssql 直接连接到 DSN 吗?
    【解决方案5】:

    我看到很多人在 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/

    【讨论】:

    • 我现在得到这个确切的错误,链接不再有效,你知道我在哪里可以得到插件吗?
    • @DavidZhanLiu:根据网络存档,那是 Python Win32 扩展。已移至sourceforge.net/projects/pywin32
    【解决方案6】:

    使用下面的官方微软包将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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 2018-07-01
        • 2014-05-28
        • 2021-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        • 1970-01-01
        相关资源
        最近更新 更多