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 SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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';

Nom : CaptureBase.PNG
Affichages : 616
Taille : 13,2 Ko

l'utilisation de la commande d'extraction donne ce code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.

Nom : CaptureBase2.PNG
Affichages : 590
Taille : 4,3 Ko

et le code SQL produit est très différent la vue a disparue et la dépendance entre le 2 table aussi

Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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?