代码之家  ›  专栏  ›  技术社区  ›  Josh Smeaton

在生产中与Django一起使用SQL Server

  •  42
  • Josh Smeaton  · 技术社区  · 15 年前

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

    我知道mssql.django-pyodbc和django-mssql是非官方支持的后端。两个项目似乎都只有一个人参与,这有点让人担心,尽管他们的参与似乎有点规律。

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

    6 回复  |  直到 6 年前
        1
  •  21
  •   Jason Baker    15 年前

    如前所述,django-pyodbc是一个很好的方法。pyodbc可能是Python最成熟的SQL Server库。

    您可能遇到的唯一问题是pyodbc不太支持存储过程(您可以调用它们,但无法从中获得结果)。你 可以 使用pymsql调用它们,但如果可能的话,我会避免使用它,因为它不支持标准的db-api接口,可能会发生更改。如果你需要这样做,你最好的选择是使用 adodbapi 直接(它包含在python win32包中,您可能最终会安装它)。

        2
  •  11
  •   Gabriel Shadi    6 年前

    这些天

    • django-mssql :导致错误“nonetype not callable”发生在 ./manage.py migrate
    • avidal/django-pyodbc :未维护。替换为:
      • django-pyodbc :不支持python 3
      • django-pyodbc-azure :目前为止对我有效
        • 编辑:似乎未维护。提出 issue 125 询问状态
        • 编辑:得到维护者的回复。将很快与Django 2.0一起更新
        • 编辑:Maintainer为Django 2.0发布了2.0版
        • 编辑:Maintainer为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
    
        3
  •  5
  •   Cloud Artisans    6 年前

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

    首先,安装本机MS ODBC驱动程序“用于SQL Server的ODBC驱动程序17”:

    # 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的数据库条目 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 设置。该系统每天约有2千名新用户。

        4
  •  4
  •   Paul    15 年前

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

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

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

        5
  •  4
  •   SaeX    9 年前

    我看到很多人在安装后都会出现以下错误 django_mssql 在Windows上:

    django.core.exceptions.ImproperlyConfigured: 'sqlserver_ado' isn't an available database backend.
    Try using django.db.backends.XXX, where XXX is one of:
      'dummy', 'mysql', 'oracle', 'postgresql_psycopg2', 'sqlite3'
    Error was: No module named sqlserver_ado.base
    

    解决方案是安装以下插件:

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

        6
  •  1
  •   tghw megawac    15 年前

    还没有在生产中使用过,但是我在django-mssql上的初步经验是相当可靠的。您所需要的只是python win32扩展,以及将sqlserver_ADO模块放到您的python路径上。从那里,你只需要 sql_server.pyodbc 作为你 DATABASE_ENGINE . 到目前为止,我还没有注意到丢失的东西,但我也还没有完全修复。