Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Python et Firebird embarqué

23 réponses
Avatar
Bogdahn
Bonjour,

J'ai dans l'idee de developper une petite application de gestion en
python. Il y a 12 tables pour l'instant et je comptais utiliser Sqlite
que je trouve tres sympa et qui je trouve s'accorde bien avec python,
mais sqlite ne gere pas les FK, faut les coder en trigger, c'est type
less etc, donc j'ai fini par lacher l'affaire et me tourner vers
firebird (pour ceux qui ne connaissent pas trop c'est un SGBD basé sur
Interbase 6 opensource de borland), le SGBD en lui même répond a toutes
mes attentes et meme plus...
En utilisant un sgbd client serveur je perdais l'interet du fichier
unique sqlite et de son architecture non C/S, ce que je trouvais
parfait pour ma petite appli dont la base de donnée ne sera pas
attaquée par plusieures personnes. Firebird propose une version
Desktop, c'est a dire un fichier unique piloté par une DLL (à la sqlite
donc), c'est donc avec interet que je me suis tourné vers cette
solution pour l'environnement windows (partant du fait que les
utilisateurs winwin n'aiment pas trop avoir à installer un serveur, que
c'est disproportionné etc et que les utilisateurs unix ont des chance
d'avoir une base de donnée déja installé et peut etre meme Firebird
justement).

Là je me heurte a un probleme : les dev python qui attaquent le sgbd
desktop firebird, j'en ai pas trouvé :)

Je pense que pour les utilisateurs linux de mon application, ca ne
devrait pas trop poser de probleme, je leur laisse la possiblité de
configurer eux meme leur sgbd et ca roule en utilisant Python Database
API, par contre je ne sais pas trop comment faire pour utiliser la
version desktop de firebird sous windows, donc je cherche des retours
d'expérience.

Si vous avez une solution pour faire un truc unique pour les deux
cibles (windows et unices) je suis intéréssé, par contre il faut que ca
reste sur un modele relationnel.

Ma question est donc : comment attaquer firebird desktop avec python
sans partir dans du win32.

Merci :)

10 réponses

1 2 3
Avatar
hg
Bogdahn wrote:

FK


Tu devrais lire celà:
http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers


hg

Avatar
hg
Bogdahn wrote:

Ma question est donc : comment attaquer firebird desktop avec python
sans partir dans du win32.


Et ce truc là ?
http://vsbabu.org/mt/archives/2003/05/23/quick_start_firebird_on_windows.html

hg

Avatar
William Dode
On 20-05-2007, hg wrote:
Bogdahn wrote:

FK


Tu devrais lire celà:
http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers


C'est curieux que sqlite ne traite toujours pas les FK, surtout qu'ils
reconnait la syntaxe et qu'il pourrait ne serait-ce que générer les
triggers qui vont bien. Quelqu'un sait pourquoi ce n'est pas le cas ou
si c'est prévu ?
Pareil pour les autres "petits trucs" comme retirer un champ d'une table
etc...

--
William Dodé - http://flibuste.net
Développeur informatique indépendant


Avatar
Bogdahn
Bogdahn wrote:

FK


Tu devrais lire celà:
http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers


hg


Bonjour,

J'ai deja lu ce document, pour preuve je vais m'auto-quote :
Bogdahn à écrit : "mais sqlite ne gere pas les FK, faut les coder en
trigger"

J'ai quand meme pas mal regardé du coté sqlite, c'est un sgbd que
j'apprecie bcp, bien plus que les Access et autres (meme si on peut pas
vraiment parler de sgbd), mais il y a des limitations, qu'on peut
pallier en code certe, mais tant qu'a faire je prefere prendre un sgbd
plus adapté c'est pour ca que j'ai regardé du coté de firebird.

Merci tout de meme :)


Avatar
Bogdahn
C'est curieux que sqlite ne traite toujours pas les FK, surtout qu'ils
reconnait la syntaxe et qu'il pourrait ne serait-ce que générer les
triggers qui vont bien. Quelqu'un sait pourquoi ce n'est pas le cas ou
si c'est prévu ?
Pareil pour les autres "petits trucs" comme retirer un champ d'une table
etc...


A mon avis c'est a cause du but du logiciel. Sqlite n'est pas un sgbd
au plein sens du terme, il est concu pour etre un replacement des
fonctions de maniputations de fichier, le sql est un langage extrement
pratique et simplifie grandement la vie, sqlite permet d'avoir cette
simplicité dans un programme en embarqué, l'objectif est donc
different. Supporter les FK va prendre beaucoup de ressources (regardez
la difference entre innodb et myisam par exemple) tout en etant peu
utile pour le but premier du logiciel. Pour ce qui est de retirer un
champ d'une table, c'est deja faisable, des scripts comme Sqlitemanger
le font...C'est de la bidouille, comme les FK par trigger.

Je pense d'ailleur que le but de l'auteur du logiciel etait d'avoir un
moteur le plus rapide possible et qu'il laisse aux utilisateurs avancés
l'oportunité d'aller plus loin, d'où les triggers évolués, c'est vrai
qu'on peut vraiment faire beaucoup de choses avec : FK, typage (pas
preset dans sqlite de base) etc.

Avatar
MCI, Shadok Gouroudoudou
Bonsoir !

Une appli avec seulement une douzaine de tables a-t'elle besoin d'un
vrai SGBD ?

Pour ce genre de "petite appli" (je te cite), il ne doit pas y avoir
plus de quelques milliers d'enregistrements.

Du coup, tu pourrais envisager de gérer ça dans une structure de
dictionnaires.

Pierre Quentel, qui passe par ici de temps à autre, avait d'ailleurs
réalisé une classe pour gérer ce genre de choses.
Certes, il n'y a pas de SQL, mais il utilise les listes en intention
pour effectuer des requêtes.
Ce petit module pourrait servir de base (je crois que son nom était
PyDBlite, ou qq chose comme ça).







--
@-salutations

Michel Claveau
Avatar
jean-michel bain-cornu
Une appli avec seulement une douzaine de tables a-t'elle besoin d'un
vrai SGBD ?

Pour ce genre de "petite appli" (je te cite), il ne doit pas y avoir
plus de quelques milliers d'enregistrements.

Du coup, tu pourrais envisager de gérer ça dans une structure de
dictionnaires.


Le fait qu'il y ait peu de tables ou que l'appli soit petite n'enlève
rien au besoin d'un SGBD.
Dans mon soft de gestion de la demande (wxQueries), je n'en ai pas
beaucoup plus et je ne vois pas comment je pourrais me passer des
jointures SQL.

Exemple : je veux la liste des demandes par client entre telle et telle
date avec en prime le nombre d'événements associés à chaque demande. En
SQL, ça fait deux lignes. Comment faire avec un dico ? Ta réponse
m'intéresse par avance...

Avatar
MCI, Shadok Gouroudoudou
Bonsoir !

Ci-dessous un exemple vite fait, non optimisé.



dd={}
dd['01']=dict(date 070501, client='Toto', quoi='demande 1')
dd['02']=dict(date 070502, client='TITI', quoi='demande 1')
dd['03']=dict(date 070503, client='Toto', quoi='demande 1')
dd['04']=dict(date 070504, client='TITI', quoi='demande 1')
dd['05']=dict(date 070505, client='Tutu', quoi='demande 1')
dd['06']=dict(date 070504, client='Toto', quoi='demande 1')
dd['07']=dict(date 070503, client='Tata', quoi='demande 1')
dd['08']=dict(date 070502, client='Toto', quoi='demande 1')

ev={}
ev['101']=dict(demande='03', trt='Reparation_11')
ev['102']=dict(demande='01', trt='Reparation_12')
ev['103']=dict(demande='03', trt='Reparation_AA')
ev['104']=dict(demande='08', trt='Reparation_BB')
ev['105']=dict(demande='03', trt='Reparation_333')
ev['106']=dict(demande='04', trt='Reparation_Zz')


#-------------------------------------------------------------------
# selection demandes > 070503 et < 070504 et comptage evenements
#-------------------------------------------------------------------

#---Methode 1------------------------------
ddsel=[i for i in dd if dd[i]['date']> 070503 and
dd[i]['date']< 070504]
evsel=[ev[i]['demande'] for i in ev]
for dem in ddsel:
print "Demande",dem," Nb",evsel.count(dem),' Data :',dd[dem]

print

#---Methode 2------------------------------
ddsel=[i for i in dd if dd[i]['date']> 070503 and
dd[i]['date']< 070504]
evsel=[ev[i]['demande'] for i in ev if ev[i]['demande']in ddsel]
for dem in ddsel:
print "Demande",dem," Nb",evsel.count(dem),' Data :',dd[dem]

--
@-salutations

Michel Claveau
Avatar
Bogdahn
Bogdahn wrote:

Ma question est donc : comment attaquer firebird desktop avec python
sans partir dans du win32.


Et ce truc là ?
http://vsbabu.org/mt/archives/2003/05/23/quick_start_firebird_on_windows.html

hg


Il s'agit de la version serveur, je cherche des infos pour interfacer
avec la version desktop (en une dll).

Merci pour ton aide.


Avatar
MCI, Shadok Gouroudoudou
Re !

On peut facilement définir une fonction qui comptera, sur une
"jointure".

Cette fonction, définie une fois pour toutes, pourrait servir de
modèle, pour réaliser toutes sortes de traitements de jointures, voire,
même, d'intégrité référentielle.



def selcount(table, champ, jointure, selection):
nb=dict(zip(selection,[0]*len(selection)))
for r in table:
if table[r][jointure] in selection:
nb[table[r][champ]]+=1
return nb

ddsel=[i for i in dd if dd[i]['date']> 070503 and
dd[i]['date']< 070504]
compt=selcount( ev, 'demande', 'demande', ddsel)
for dem in ddsel:
print "Nb :",compt[dem],' Data :',dd[dem]





--
@-salutations

Michel Claveau
1 2 3