从 Linux 查询另一个现有的 MSSQL 数据库

Query one more existing MSSQL DB from Linux

我已经在 VirtualBox 的 Linux (Ubuntu) 上部署了 django 应用程序 运行。 settings 文件数据库部分如下所示。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

在本地网络上有一个 MSSQL Server 数据库 x 和一些表。我想用 datagrid 创建一个 view,它能够处理来自数据库 x 的数据,提供基本的 CRUD 功能和过滤器的可能性。 您能否向我介绍我需要完成的相应文档的步骤?您无需详细介绍,只需向我介绍我需要编辑的内容以及为达到预期效果我应该注意的事项。

这是我的目录树

pd_videowebapp
├── db.sqlite3
├── env
│   ├── bin
│   ├── lib
│   │   └── python3.6
├── manage.py
├── media
├── mysite
│   ├── core
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── filters.py
│   │   ├── forms.py
│   │   ├── __init__.py
│   │   ├── migrations
│   │   ├── models.py
│   │   ├── __pycache__
│   │   ├── tests.py
│   │   └── views.py
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings.py
│   ├── static
│   │   ├── style2.css
│   │   └── style3.css
│   ├── templates
│   │   ├── base2.html
│   │   ├── base.html
│   │   ├── edit_videos_list.html
│   │   ├── filtered_videos_list.html
│   │   ├── home.html
│   │   ├── upload.html
│   │   ├── user_list.html
│   │   └── videos_list.html
│   ├── urls.py
│   └── wsgi.py
├── Pipfile
├── requirements.txt
├── static
│   ├── admin
│   │   ├── css
│   │   ├── fonts
│   │   ├── img
│   │   └── js
│   ├── style2.css
│   └── style3.css

通常,您在 settings.py.

中指定 hostportdatabase_name 等设置

pipy 上有用于 mssql 连接的驱动程序包 django-mssql-backend。它提供了一个很好的 README.md,您可以在其中阅读更多内容。


一般情况下,如果要将 mssql-server 设置为默认数据库,请将默认配置替换为 mssql-config:

DATABASES = {
    'default': {
        'ENGINE': "sql_server.pyodbc",
        'NAME': "DB_NAME",
        'HOST': "127.0.0.1",
        'PORT': 1234,
    }
}

如果要将 mssql-server 添加为新数据库,需要在 DATABASES-configuration 中将其指定为新条目:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'mssql': {
        'ENGINE': "sql_server.pyodbc",
        'NAME': "DB_NAME",
        'HOST': "127.0.0.1",
        'PORT': 1234,
    }
}

如果将数据库添加为新条目,则需要指定 DatabaseRouter 以将查询路由到正确的数据库。您可以在官方 django 文档 here 上找到很好的概述。 像这样在 settings.py 中添加 DatabaseRouter

DATABASE_ROUTERS = ['path.to.MSSQLRouter']

现在创建一个新应用(您需要在新创建的路由器中指定 app_name)并照常添加模型、视图和 url 路由。

要在 Django 中使用 MSSQL,首先需要安装 django-mssql-backend 包,运行 在控制台中执行此命令:

pip install django-mssql-backend

在项目的 settings.py 文件中配置新数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
    'mssql_database': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'db_name',  # The name of your database
        'USER': 'username',  # The username of the user used to manage the database
        'PASSWORD': '12345',  # The password of the user used to manage the database
        'HOST': 'localhost',  # Or a different IP to locate the server
        'PORT': '',  # Uses the default port
        'OPTIONS': {
           'driver': 'ODBC Driver 17 for SQL Server',  # Or another version
        },
    }
}

您需要定义一个路由器,告诉 Django 何时使用新数据库。路由器根据包含它的应用程序而不是模型名称来决定给定模型使用哪个数据库,所以我们需要创建一个新的应用程序,运行 这个在控制台中(你可以选择应用程序,但请记住更改我引用其名称的代码):

python manage.py startapp mssql_app

settings.pyINSTALLED_APPS 中添加应用:

INSTALLED_APPS = [
   # Other apps
   'mssql_app',
]

创建一个包含路由器的新文件(可能在 mssql_app/routers.py 中):

class MSSQLRouter:
    """
    A router to control all database operations on models in the mssql_app application.
    """
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'mssql_app':
            return 'mssql_database'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'mssql_app':
            return 'mssql_database'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'mssql_app' or obj2._meta.app_label == 'mssql_app':
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'mssql_app':
            return db == 'mssql_database'
        return None

路由器的工作原理如下:当模型包含在mssql_app应用程序中时使用MSSQL数据库,否则使用默认数据库。

在您的 settings.py:

添加路由器
DATABASE_ROUTERS = ['mssql_app.routers.MSSQLRouter', ]  # Or another path

现在您需要检查 MSSQL 数据库以使用 Django 创建模型,运行 在控制台中执行此命令:

python manage.py inspectdb --database=mssql_database

inspectdb 的输出将包含组合在一起的所有生成模型。复制并粘贴文件 mssql_app/models.py.

中的内容

请注意 inspectdb 是一个快捷方式,因此您应该优化生成的模型。阅读 documentation 以了解有关如何正确编写模型的详细信息。

查看 this for all details on how integrate Django with an existing database and at this 以了解有关如何使用多个数据库的所有详细信息。

现在如果你想为 mssql_app 应用程序的模型编写视图,只需将它们放在 mssql_app/views.py 文件中,阅读这个 section (视图层)有关如何创建视图的详细信息的文档。

举个例子,我将编写一个视图来列出特定模型的实例。

将此视图添加到 mssql_app/views.py(将 ModelName 替换为您的模型名称):

from django.views.generic import ListView
from .models import ModelName

class ModelNameListView(ListView):
    model = ModelName
    template_name = 'list.html'

# Other views

mysite/urls.py 中写入此 url 模式:

from django.urls import path
from mssql_app.views import ModelNameListView

urlpatterns = [
    path('list/', ModelNameListView.as_view()),
    # Other url patterns
]

最后写一个显示模型实例信息的模板(放在mysite/templates/list.html):

<h1>List</h1>
<ul>
{% for single_object in object_list %}
    <li>{{ single_object.property1 }}</li>
    <li>{{ single_object.property2 }}</li>
{% empty %}
    <li>No Instances.</li>
{% endfor %}
</ul>

这个模板简单地遍历模型实例并显示 property1property2 的值(我不知道你的模型有哪些字段,所以替换 property1property2 替换为您模型的属性名称)。