从 Linux 查询另外一个现有的 MSSQL DB

Posted

技术标签:

【中文标题】从 Linux 查询另外一个现有的 MSSQL DB【英文标题】:Query one more existing MSSQL DB from Linux 【发布时间】:2022-01-09 15:30:47 【问题描述】:

我在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

【问题讨论】:

现有答案中没有您正在寻找的东西吗? @aaron 是的。我想对提到的目录结构使用确切的命令进行更精确的描述。它应该可以在 Linux 上运行。它应该从数据库生成模型,并在具有合适库的视图中显示数据网格的工作。在现有的答案中,我对路由器的工作尤其不清楚。答案可以是显示简约示例的编号列表形式。 和目录结构有什么关系? 这个问题有很多需要改进的地方。 1.Needs more focusThis question currently includes multiple questions in one. It should focus on one problem only.2.Seeking recommendations for books, tools, software libraries, and moreThis question is likely to lead to opinion-based answers. @aaron OK,答案可以省略数据网格。我可能会为此创建另一个问题。它应该概述工作示例“如何从另一个数据库获取数据并在视图中使用它。它应该在 Linux 上工作并自动从现有的 MSSQL DB 生成模型。 【参考方案1】:

通常,您可以在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 路由。

【讨论】:

【参考方案2】:

要在 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

INSTALLED_APPSsettings.py 中添加应用程序:

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 了解有关如何将 Django 与现有数据库集成的所有详细信息,以及查看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

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型号)。

【讨论】:

我的项目有映射到 SQLite 数据库的模型。我希望这些信息不在 MSSQL 数据库中。我想保留到目前为止的功能,只添加其他 MSSQL 数据库。 MSSQL 服务器在 Windows 上运行,Web 服务器在 Linux 上运行。 我试过 [github.com/Microsoft/msphpsql/issues/… 但没有帮助。 @xralf 好的。同时我更新了我的答案以与 ODBC 17 兼容(我只更改了数据库的设置)。 @xralf 如果您已正确配置设置,您可以将模板放入mysite/templates(如果您现有的模板正常工作,则您的设置没问题)。我将用更好的视图示例更新我的答案。 感谢您的出色回答和对我的耐心:-)

以上是关于从 Linux 查询另外一个现有的 MSSQL DB的主要内容,如果未能解决你的问题,请参考以下文章

使用 MSSQL 返回相同孩子的学说

MSSQL Server 数据库备份还原常用SQL语句及注意

MSSQL Server 数据库备份还原常用SQL语句及注意

Visual Basic 需要从 MySQL 更改为 MSSQL

如何从现有的 JavaScript 库生成 .d.ts “类型”定义文件?

请问下linux下如何安装mssql,尤其是宝塔面板?