2 pièce(s) jointe(s)
SQL ALCHEMY retroEngenierie
bonjour
Je cherche a construire la structure des tables d'une base de données sous la forme de code Python.
J'ai découvert sqlacodegen pour outil de 2020.
L'installation sous Pip pip install sqlacodegen est simple et la commande en ligne sqlacodegen sqlite:///Base.DB --outfile base.py permet de recrééer la structure de cette base SQLlite.
Il s'agit d'un outil qui lit la structure d'une base de données existante et génère les Code du modèle SQLAlchemy, en utilisant le style déclaratif si possible.
Cet outil a été écrit pour remplacer sqlautocode , qui souffrait de plusieurs problèmes (y compris, mais sans s'y limiter, l'incompatibilité avec Python 3 et la dernière version de SQLAlchemy).
Mais voila tous n'est pas aussi simple.
voici ma petite base créer en SQL 2 tables et une vue
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| CREATE TABLE "Marque" (
IdMarque INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
nom TEXT,
descrition TEXT
);
CREATE TABLE "Appareil_photo" (
IdAppareil INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
nom TEXT,
IdMarque INTEGER NOT NULL CONSTRAINT FK_IdMarque
REFERENCES "Marque" (IdMarque),
date_ac DATETIME
);
create view canon as
select ap.* , m.nom
from "Appareil_photo" ap inner join "Marque" m
on ap.IdMarque = m.IdMarque
and m.IdMarque ='Canon'; |
Pièce jointe 625198
l'utilisation de la commande d'extraction donne ce code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| # coding: utf-8
from sqlalchemy import Column, DateTime, ForeignKey, Integer, Table, Text
from sqlalchemy.sql.sqltypes import NullType
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
Base = declarative_base()
metadata = Base.metadata
class Marque(Base):
__tablename__ = 'Marque'
IdMarque = Column(Integer, primary_key=True)
nom = Column(Text)
descrition = Column(Text)
t_canon = Table(
'canon', metadata,
Column('IdAppareil', Integer),
Column('nom', Text),
Column('IdMarque', Integer),
Column('date_ac', DateTime),
Column('nom:1', Text)
)
t_sqlite_sequence = Table(
'sqlite_sequence', metadata,
Column('name', NullType),
Column('seq', NullType)
)
class AppareilPhoto(Base):
__tablename__ = 'Appareil_photo'
IdAppareil = Column(Integer, primary_key=True)
nom = Column(Text)
IdMarque = Column(ForeignKey('Marque.IdMarque'), nullable=False)
date_ac = Column(DateTime)
Marque = relationship('Marque') |
on retrouve donc nos 2 classes liées aux 2 tables mais aucune trace de la vue.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Marque(Base):
__tablename__ = 'Marque'
IdMarque = Column(Integer, primary_key=True)
nom = Column(Text)
descrition = Column(Text)
class AppareilPhoto(Base):
__tablename__ = 'Appareil_photo'
IdAppareil = Column(Integer, primary_key=True)
nom = Column(Text)
IdMarque = Column(ForeignKey('Marque.IdMarque'), nullable=False)
date_ac = Column(DateTime)
Marque = relationship('Marque') |
Si l'on cherche à utiliser le code en l'état en ajoutant le moteurs de création de la base
Code:
1 2 3
| engine = create_engine('sqlite:///basephoto.db')
Base.metadata.create_all(engine) # Only for the first time |
L'exécution renvoi une erreur pour chaque table
Citation:
raise exception
sqlalchemy.exc.CompileError: (in table 'sqlite_sequence', column 'name'): Can't generate DDL for NullType(); did you forget to specify a type on this Column?
Mais la base est créer mais n'est pas identique au modèle d'Origine.
Pièce jointe 625197
et le code SQL produit est très différent la vue a disparue et la dépendance entre le 2 table aussi
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| -- canon definition
CREATE TABLE canon (
"IdAppareil" INTEGER,
nom TEXT,
"IdMarque" INTEGER,
date_ac DATETIME,
"nom:1" TEXT
);
-- Marque definition
CREATE TABLE "Marque" (
"IdMarque" INTEGER NOT NULL,
nom TEXT,
descrition TEXT,
PRIMARY KEY ("IdMarque")
); |
- L'autoincrementation a disparue
- La relation entre les deux tables a disparue
Dommage .....
Question existe-t-il des outils similaires et p pour permettre de recréer le code python à partir d'un base de données ?
Et est-il possible de créer une vue avec sqlalchemy?