2017-06-14 1 views
1

J'utilise deux schémas mysql X et Y, les deux contiennent plusieurs tables mais il y a une table qui a le même nom dans les deux schémas.Comment utiliser deux tables avec le même nom dans deux schémas différents dans mysql avec django

Les deux schémas sont les suivants:

+--------------+--+--------------+ 
| X   | | Y   | 
+--------------+--+--------------+ 
| name   | | album_info | 
+--------------+--+--------------+ 
| invite  | | photo_info | 
+--------------+--+--------------+ 
| photo  | | photo  | 
+--------------+--+--------------+ 
| user_details | | temp   | 
+--------------+--+--------------+ 

Maintenant, je veux interroger sur les deux tableaux, mais quand j'écris la structure de la table dans le fichier models.py avec le même nom, il jette l'erreur/exception. Je déclare à la fois la table dans le fichier routers.py comme ci-dessous:

modelDatabaseMap = { 
    . 
    'photo': 'default', 
    . 
    . 
    . 
    'photo': 'y', 
} 

(X est mon schéma par défaut). Déclaré i models.py comme ci-dessous:

class Photo(models.Model): 
    id = models.AutoField(db_column='ID', primary_key=True) 
    has_tagged_with = models.IntegerField() 
    has_reposted_with = models.IntegerField() 
    . 
    . 

    class Meta: 
     managed = False 
     db_table = 'photo' 

class Photo(models.Model): 
    id = models.AutoField(db_column='ID', primary_key=True) 
    account_id = models.IntegerField() 
    p_id = models.IntegerField() 
    is_profile = models.IntegerField() 
    . 
    . 

    class Meta: 
     managed = False 
     db_table = 'photo' 

Maintenant, l'ambiguïté est le premier nom, dans la déclaration en models.py et d'autre part dans l'interrogation. Je suis bloqué sur comment interroger séparément les deux tables via orm. Toute aide ou initiative à cet égard serait utile. Merci d'avance.

+0

Avez-vous une connexion pour chaque schéma? Comment est votre configuration 'DATABASES'? –

+0

configuration DATABASES est la suivante: 'BASES = { 'default': { 'MOTEUR': 'django.contrib.gis.db.backends.mysql', 'NOM': 'X', 'USER' : nom_utilisateur_bdd, 'MOT DE PASSE': DATABASE_PASSWORD, 'HOST': DATABASE_HOST_NAME, 'PORT': '3306', 'OPTIONS': { 'charset': 'utf8mb4'}, } } ' même façon que je ajout du schéma Y dans le dictionnaire. – Shrey

+0

c'est le point. Vous avez deux configurations de base de données? un 'default' et autre' y', par exemple? –

Répondre

0

Compte tenu de votre configuration DATABASES, vous pouvez essayer:

  1. Changer vos modèles nom ou créer une nouvelle application avec un module models différent pour chaque schéma:

    class YPhoto(models.Model): 
        ... 
    
    class XPhoto(models.Model): 
        ... 
    
  2. Créer une router.py module:

    class MyRouter(object): 
    
    def db_for_read(self, model, **hints): 
        if model.__name__ == 'YPhoto': 
         return 'Y' 
        return None 
    
    def db_for_write(self, model, **hints): 
        if model.__name__ == 'YPhoto': 
         return 'Y' 
        return None 
    
    def allow_relation(self, obj1, obj2, **hints): 
        # Maybe you want to prevent relations between different schemas, it's up to you 
        return True 
    
    def allow_syncdb(self, db, model): 
        return True 
    
  3. Ajouter le routeur à l'settings.py:

    DATABASE_ROUTERS = ['myapp.models.MyRouter',] 
    

Vérifiez la docs sur le routage de base de données.

+0

Oups, j'ai remarqué que vous devez vérifier toutes les tables dans le schéma 'Y' dans le' if's.Peut-être que vous êtes mieux de créer une nouvelle application pour les tables dans le schéma «Y» –

+0

Merci, va essayer cela. – Shrey

+0

Je voudrais demander à répondre à une autre question de la mienne, le lien est ci-dessous: https://stackoverflow.com/questions/44496101/how-to-insert-emoji-into-mysql-5-5-and-higher-using- django-orm? noredirect = 1 # comment75996316_44496101 – Shrey