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';
l'utilisation de la commande d'extraction donne ce code
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
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')
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
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')
L'exécution renvoi une erreur pour chaque table
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
Mais la base est créer mais n'est pas identique au modèle d'Origine.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?
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?
Partager