使用[Django]来利用现有的数据库的方法

关于这篇文章

这是一份有关如何使用Django连接已有数据库的方法备忘录。
假设情景是使用Django开发现有系统的管理工具。

参考:将传统的数据库与Django整合的公式。

可以在Django中使用的数据库

Django 支持的数据库服务器包括官方支持的 PostgresSQL、MySQL、Oracle,以及非官方支持的 SQL Server。尽管涵盖了主要数据库,但需要注意其版本限制。

    Django公式:利用可能なデータベース

Django 2.1 版本的时候

データベースバージョンPostgreSQL9.4 以上Oracle12.1 以上MySQL5.6 以上SQLServer2008 以上

需要注意的事项

由于Django的启动需要一些管理表(表名以auth或django开头),所以不能完全使用现有的数据库。为了让Django使用的连接用户能够创建表并执行迁移,需要给予其创建表的权限。

在迁移时,Django生成的表数量大约有十几个。如果在管理方面有所担心,可以事先创建一个Django模式(schema),并确保表在该模式下进行创建。对于现有系统的表,可以提前创建别名并分配最低限度的权限,以确保安全性。

在Django中,没有主键的表或者主键是复合键的表是不能使用的。

工作内容

连接到数据库

首先,使用pip工具安装连接到各个数据库所需的库。

データベースバージョンPostgreSQLpsycopg2MySQLmysqlclientOraclecx_OracleSQLServerdjango-pyodbc-azure

如果使用SQLServer,您还需要在操作系统上安装ODBC驱动程序。

※ 也有适用于Linux的ODBC驱动程序。参考:Linux使用ODBC连接到SQL Server。

然后,修改settings.py中的DATABASES。

    Django 公式:データベース接続設定の書き方

以下是对”postgres”的中文释义:
PostgreSQL

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432', 
    }
}

需要进行SQLServer ODBC设置。


DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'mydb',
        'USER': 'user@myserver',
        'PASSWORD': 'password',
        'HOST': 'myserver.database.windows.net',
        'PORT': '',

        'OPTIONS': {
            'driver': 'ODBC Driver 13 for SQL Server',
        },
    },
}

可以通过管理命令manage.py dbshell来确定设置是否成功。

使用inspectdb命令来查找模型定义的代码。

Django提供了用于读取现有表格并创建模型定义的管理命令。

usage: manage.py inspectdb [-h] [--database DATABASE] [--include-views]
                           [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                           [--pythonpath PYTHONPATH] [--traceback]
                           [--no-color]
                           [table [table ...]]

我們將在models.py中定義此處輸出的程式碼。

class SampleItem(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    name = models.CharField(max_length=15)

    class Meta:
        managed = False
        db_table = 'sample'

如果要在进行数据添加的表格上进行操作,需要将id的定义从IntegerField更改为AutoField。

class Meta: 在下面进行以下配置。

managed = False: migrationsの管理対象外とする

db_table = ‘sample’: テーブル名を明示

参考:のぶ实验室。在Django中使用现有的数据库。

3. 迁移

一旦模型定义完成,就执行迁移操作。这将在目标数据库中创建Django的管理表。

请通过manage.py shell执行既存表的模型名.objects.first()等命令来访问现有表的数据进行确认。

应该可以毫无问题地使用manage.py runserver命令启动应用程序。

广告
将在 10 秒后关闭
bannerAds