关于django操作orm的一些事--反向生成orm、连接多个数据库

1. django反向生成orm的类代码

使用命令python manage.py inspectdb > app01/models.py,注意,我这里的app01是app的名字。

2.django连接多个数据库

在很多情况下,一个项目里面不止一个app,也不止使用一个库,那么就面临着连接多个数据库的问题。

那么先来说说,如何连接使用多个app连接多个数据库:

以mysql为例:

在settings.py文件里面:

DATABASES = {    ‘default‘: {        ‘ENGINE‘: ‘django.db.backends.mysql‘,        ‘NAME‘: "db0",        ‘USER‘: ‘root‘,        ‘PASSWORD‘: ‘123456‘,        ‘HOST‘: ‘127.0.0.1‘,        ‘PORT‘: ‘3306‘,    },    ‘db1‘: {        ‘ENGINE‘: ‘django.db.backends.mysql‘,        ‘NAME‘: ‘db1‘,        ‘USER‘: ‘root‘,        ‘PASSWORD‘: ‘123456‘,        ‘HOST‘: ‘127.0.0.1‘,        ‘PORT‘: ‘3306‘,    },    ‘db2‘: {        ‘ENGINE‘: ‘django.db.backends.mysql‘,        ‘NAME‘: ‘db2‘,        ‘USER‘: ‘root‘,        ‘PASSWORD‘: ‘123456‘,        ‘HOST‘: ‘127.0.0.1‘,        ‘PORT‘: ‘3306‘,    },}# 此配置,列表里写:   项目工程的名字.database_router.DatabaseAppsRouterDATABASE_ROUTERS = [‘your_project_name.database_router.DatabaseAppsRouter‘]DATABASE_APPS_MAPPING = {    # 这里面对应的是,app的名字和数据库的名字(在上面注册的)    ‘app01‘: ‘default‘,    ‘app02‘: ‘db1‘,    ‘app03‘: ‘db2‘,}

另外,为了能够访问到不同的库,还需要加一个文件,写上数据库的路由:

你的项目名/项目名的文件夹下(举例:比如我起了一个项目叫test_django,那么在test_django/test_django,也就是和settings.py同级目录),新建一个文件叫:

database_router.py,写入如下代码:

# database_router.pyfrom 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?    # for Django 1.4 - Django 1.6    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.

相关推荐