2016-01-08 3 views
0

exécutant cette commande:Sqlacodegen génère des modèles mixtes et tables

sqlacodegen <connection-url> --outfile db.py 

Le db.py contient: la génération de tables

t_table1 = Table(...) 

et des classes aussi:

Table2(Base): 
    __tablename__ = 'table2' 

Le problème est que une table est générée d'une seule façon - soit une table ou une classe.

Je voudrais le faire générer des modèles (classes) seulement mais dans les drapeaux fournis je ne pouvais pas trouver une telle option. Une idée?

Répondre

5

Il semble que ce que vous décrivez soit une fonctionnalité en soi. sqlacodegen ne générera pas toujours des modèles de classe.

Il sera uniquement des classes de modèle de formulaire pour les tables qui ont une clé primaire et ne sont pas des tables d'association, comme vous pouvez le voir dans le source code:

# Only form model classes for tables that have a primary key and are not association tables 
if noclasses or not table.primary_key or table.name in association_tables: 
    model = self.table_model(table) 
else: 
    model = self.class_model(table, links[table.name], self.inflect_engine, not nojoined) 
    classes[model.name] = model 

En outre, dans le documentation il est indiqué que

une table est considérée comme une table d'association si elle satisfait à toutes les conditions suivantes:

  1. a exactement deux clés étrangères
  2. toutes ses colonnes sont impliquées dans lesdites contraintes

Bien, vous pouvez essayer un hack rapide et sale. Localiser les lignes dans le code source (quelque chose comme /.../lib/python2.7/site-packages/sqlacodegen/codegen.py) et de commenter les trois premières lignes de code (et fixer indentation):

# Only form model classes for tables that have a primary key and are not association tables 
# if noclasses or not table.primary_key or table.name in association_tables: 
# model = self.table_model(table) 
# else: 
model = self.class_model(table, links[table.name], self.inflect_engine, not nojoined) 
classes[model.name] = model 

J'ai essayé pour une table spécifique qui a été généré en tant que modèle de table. Il est passé de

t_Admin_op = Table(
    'Admin_op', metadata, 
    Column('id_admin', Integer, nullable=False), 
    Column('id_op', Integer, nullable=False) 
) 

à

class AdminOp(Base): 
    __tablename__ = 'Admin_op' 

    id_admin = Column(Integer, nullable=False) 
    id_op = Column(Integer, nullable=False) 

Vous pouvez également ouvrir une question à ce sujet comme une demande de fonctionnalité, dans le official tracker. Juste au cas où, si vous voulez l'opposé (seulement les modèles de table), vous pouvez le faire avec le drapeau --noclasses.