多数据库
2022/1/9大约 2 分钟pythonweb框架
多数据库
系统应用要用到一下这些表
auth_group
auth_group_permissions
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_migrations
django_session
sqlite_master
sqlite_sequence
如果需要集成现有的数据库的数据,则需要为 Django 配置多数据库
配置数据库连接
先在 settings.py 配置数据库名及其连接参数
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'cip': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'testdba',
'USER': 'cipserver',
'PASSWORD': 'neu0821',
'HOST': '10.211.95.153',
'PORT': '1521',
}
}
然后就可以把该数据里的某个表导出成 model
python manage.py inspectdb --database cip cip_content_info_t > new_models.py
删除不要的属性,以及调整模型的字段数据类型,无法正确转换的都统一转换成了 TextField
class CipContentInfoT(models.Model):
content_id = models.TextField(blank=True, null=True) # This field type is a guess.
content_name = models.TextField(blank=True, null=True) # This field type is a guess.
is_finish = models.TextField(blank=True, null=True) # This field type is a guess.
chapter_count = models.TextField(blank=True, null=True) # This field type is a guess.
content_score = models.TextField(blank=True, null=True) # This field type is a guess.
keywords = models.TextField(blank=True, null=True) # This field type is a guess.
infofee_chapter_id = models.BigIntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'cip_content_info_t'
# 加上 app_label,待会实现路由逻辑的时候要用到
app_label = 'xima'
创建一个应用,把这个模型放到应用的 models.py 模块里
python manager.py startapp xima
注册应用到 Django 系统
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'xima.apps.XimaConfig'
]
在 admin 里也注册,使得可以通过 admin 管理这个模型的数据
# Register your models here.
from django.contrib import admin
from .models import CipContentInfoT
admin.site.register(CipContentInfoT)
settings.py 里配置 DATABASE_ROUTERS 变量,指定一个能实现路由功能的类
DATABASE_ROUTERS = ['cip_ops.database_router.DatabaseAppsRouter']
在 Django 项目目录里创建 database_router.py 模块来实现 DatabaseAppsRouter 类
from django.conf import settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
class DatabaseAppsRouter(object):
"""
A router to control all database operations on models for different
databases.
In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
will fallback to the `default` database.
Settings example:
DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
"""
def db_for_read(self, model, **hints):
""""Point all read operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None
def db_for_write(self, model, **hints):
"""Point all write operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None
def allow_relation(self, obj1, obj2, **hints):
"""Allow any relation between apps that use the same database."""
db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None
def allow_syncdb(self, db, model):
"""Make sure that apps only appear in the related database."""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(model._meta.app_label) == db
elif model._meta.app_label in DATABASE_MAPPING:
return False
return None
def allow_migrate(self, db, app_label, model=None, **hints):
"""
Make sure the auth app only appears in the 'auth_db'
database.
"""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING:
return False
return None