在生产中使用带有Django的Sql Server

Jos*_*ton 47 python sql-server django pyodbc

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

我知道mssql.django-pyodbc和django-mssql是非正式支持的后端.这两个项目似乎只有一个人贡献,这有点担心,虽然贡献似乎有点规律.

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

Jas*_*ker 21

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

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

  • 您可以通过调用它们来获取SQLServer存储过程的结果:`cursor.execute('DECLARE @results int; EXEC @ results = spMyProc; SELECT @results')` (3认同)

sha*_*adi 15

这些日子

编辑:这是包版本

Django==1.11.6
django-mssql==1.8
pyodbc==4.0.19
django-pyodbc==1.1.1
django-pyodbc-azure==1.11.0.0
Run Code Online (Sandbox Code Playgroud)

  • 提供Django版本和您测试的库会很有帮助,因为这些信息很快就会过时. (2认同)

Clo*_*ans 7

这是这个问题的"现代"答案.我成功地在生产Ubuntu 16.04服务器上部署了Django 1.11,该服务器连接到在另一台服务器上运行的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
Run Code Online (Sandbox Code Playgroud)

其次,确保你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
Run Code Online (Sandbox Code Playgroud)

第三,修改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
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

我省略了我的其余配置(nginx,Gunicorn,Django REST Framework等),但这超出了这个答案的范围.

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


Sat*_*hia 3

使用下面的Microsoft 官方包将 SQL Server 连接到 Django。

pip install mssql-django
Run Code Online (Sandbox Code Playgroud)

设置

 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
Run Code Online (Sandbox Code Playgroud)

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