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



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

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

在本地网络上有一个带有数据库x和几个表的MSSQL Server。我想用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

要在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.py:的INSTALLED_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是一个快捷方式,因此您应该细化生成的模型。有关如何正确编写模型的详细信息,请阅读文档。

看看这里,了解如何将Django与现有数据库集成的所有细节,以及如何使用多个数据库的所有细节。

现在,如果您想为mssql_app应用程序的模型编写视图,只需将它们放在mssql_app/views.py文件中,请阅读文档的这一部分(视图层(,了解如何创建视图的详细信息。

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

将此视图添加到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(。

通常在settings.py中指定hostportdatabase_name等设置。

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


通常,如果您想将mssql服务器设置为默认数据库,请将默认配置替换为mssql-config:

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

如果您想将mssql服务器添加为新数据库,则需要将其指定为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文档中找到一个很好的概述。在settings.py中添加DatabaseRouter,如下所示:

DATABASE_ROUTERS = ['path.to.MSSQLRouter']

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

最新更新