Something about django orm of operations - Reverse generate orm, connecting multiple databases

1. django orm reverse generated class code

Using the command python manage.py inspectdb > app01/models.py, pay attention, app01 I have here is the app name.

2.django connect multiple databases

In many cases, a project which is more than one app, also use more than one library, then faced with the problem of connecting multiple databases.

So first is that, how to connect using multiple app to connect multiple databases:

To mysql example:

In settings.py file inside:

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',   }, } # this configuration, the list write: the name of the project works .database_router.DatabaseAppsRouter DATABASE_ROUTERS = [ 'your_project_name.database_router.DatabaseAppsRouter '] DATABASE_APPS_MAPPING = { # should face here is that the name of the app name and the database (registered above) ' app01 ': ' default ', ' app02 ': ' db1 ', ' app03 ': ' the DB2 ', }
       
       





   
   
   
   

In addition, in order to be able to have access to different libraries also need to add a file, write the routing of the database:

In the name of your project / project folder under the file name (Example: For example, I played a project called test_django, then test_django / test_django, that is, and settings.py same directory) , create a file called:

database_router.pyWriting the following code:

# database_router.py
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

   # 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.get(model._meta.app_label) == db
       elif model._meta.app_label in DATABASE_MAPPING:
           return False
       return None

   # Django 1.7 - Django 1.11
   def allow_migrate(self, db, app_label, model_name=None, **hints):
       print(db, app_label, model_name, hints)
       if db in DATABASE_MAPPING.values():
           return DATABASE_MAPPING.get(app_label) == db
       elif app_label in DATABASE_MAPPING:
           return False
       return None

Well, this time, you can access a different database.

Generating a plurality of reverse orm Code Database 3.django

Now, multiple libraries already have, then, how to use different libraries, orm generate code in a different app inside it?

python manage.py inspectdb --database db1 > app01/models.py

Note that the above db1 is registered in your settings.py file the following DATABASES, inside the database name, app01 your app name.

 

Solve the bug:

When confronted bug:

# The error was: (1, "Can't create/write to file '/tmp/#sql_7d33_0.MYI' (Errcode: 13 - Permission denied)")
# Unable to inspect table 'session'

To the server hosting the database:

chmod 777 /tmp

To resolve this issue.

Guess you like

Origin www.cnblogs.com/haiguixiansheng/p/11732162.html