Question

Je cherchais un moyen de définir des tables de base de données et de les modifier via une API Django.

Par exemple, je voudrais être écrire un code qui manipule directement à la table et me permettre DDL de définir des tables ou ajouter des colonnes à une table sur demande par programme (sans courir un syncdb). Je me rends compte que django-sud et django-évolution peut venir à l'esprit, mais je ne pense pas vraiment de ces outils comme des outils destinés à être intégrés dans une application et utilisé par l'utilisateur final et ... plutôt ces outils sont utilisés pour les services publics mettre à jour vos tables de base de données. Je cherche quelque chose où je peux faire quelque chose comme:

class MyModel(models.Model):  # wouldn't run syncdb.. instead do something like below
    a = models.CharField()
    b = models.CharField()

model = MyModel()
model.create()  # this runs the create table (instead of a syncdb)

model.add_column(c = models.CharField())  # this would set a column to be added
model.alter()   # and this would apply the alter statement 

model.del_column('a')   # this would set column 'a' for removal 
model.alter()   # and this would apply the removal 

Ceci est juste un exemple de jouet de la façon dont une telle API fonctionnerait, mais le point est que je serais très intéressé à savoir s'il y a un moyen de créer et programatically tables de changement comme celui-ci. Cela peut être utile pour des choses telles que les systèmes de gestion de contenu, où l'on pourrait vouloir créer dynamiquement une nouvelle table. Un autre exemple serait un site que les ensembles de données stocke d'une largeur arbitraire, dont les tables doivent être générées dynamiquement par les importations d'interface ou de données. Dose quelqu'un sait de bonnes façons de créer dynamiquement et tables alter comme celui-ci?

(D'accord, je sais que l'on peut faire des déclarations SQL directes contre la base de données, mais cette solution n'a pas la capacité de traiter les bases de données comme des objets)

Juste curieux de savoir si les gens ont des suggestions ou approches à cet égard ...

Était-ce utile?

La solution

Vous pouvez essayer de l'interface avec le code du django qui gère les changements dans la base de données. Il est un peu limité (pas ALTER, par exemple, dans la mesure où je peux voir), mais vous pouvez être en mesure de le prolonger. Voici un extrait de django.core.management.commands.syncdb.

for app in models.get_apps():
        app_name = app.__name__.split('.')[-2]
        model_list = models.get_models(app)
        for model in model_list:
            # Create the model's database table, if it doesn't already exist.
            if verbosity >= 2:
                print "Processing %s.%s model" % (app_name, model._meta.object_name)
            if connection.introspection.table_name_converter(model._meta.db_table) in tables:
                continue
            sql, references = connection.creation.sql_create_model(model, self.style, seen_models)
            seen_models.add(model)
            created_models.add(model)
            for refto, refs in references.items():
                pending_references.setdefault(refto, []).extend(refs)
                if refto in seen_models:
                    sql.extend(connection.creation.sql_for_pending_references(refto, self.style, pending_references))
            sql.extend(connection.creation.sql_for_pending_references(model, self.style, pending_references))
            if verbosity >= 1 and sql:
                print "Creating table %s" % model._meta.db_table
            for statement in sql:
                cursor.execute(statement)
            tables.append(connection.introspection.table_name_converter(model._meta.db_table))

Jetez un oeil à connection.creation.sql_create_model. L'objet creation est créé dans la base de données principale de la base en vous utilisez dans votre settings.py. Tous sont sous django.db.backends.

Si vous devez avoir la table ALTER, je pense que vous pouvez créer votre propre arrière-plan personnalisé qui étend une entreprise existante et ajoute cette fonctionnalité. Ensuite, vous pouvez interagir avec directement par un ExtendedModelManager vous créez.

Autres conseils

rapidement du haut de ma tête ..

Créez un gestionnaire personnalisé avec l'option Créer / méthodes de modification.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top