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

Fonction Python et MySQL, pour créer une clé étrangère

2 réponses
Avatar
Olivier92410
Bonjour, Je veux insérer dans plusieurs tables une clé étrangère.
Pour cela, j'ai créé un dictionnaire qui fournira à une fonction les paramètres nécessaires à la création de ces clés.

Ci-dessous, une partie du dictionnaire utilisé, pour rester simple:
d_fk = {'Bien_Immo': ['fk_Id_Lot', 'Lot', 'Id']}

Puis la fonction,
def create_fk(name1, name2, name3, name4):
url = "e;mysql+pymysql://{user}:{password}@localhost/{db}"e;
engine = create_engine(url.format(user='root', password='Fer458it', db='data_immo'))
engine.execute(f"e;ALTER TABLE {name1}"e;
f"e;ADD COLUMN {name2},"e;
f"e;ADD CONSTRAINT {name2}"e;
f"e;ADD FOREIGN KEY ({name2}) REFERENCES {name3}({name4})"e;
f"e;ON DELETE CASCADE"e;)
return

for key in d_fk.keys():
if isinstance(d_fk[key][0], list):
for i in range(len(d_fk[key])):
[n2, n3, n4] = [d_fk[key][i][0], d_fk[key][i][1], d_fk[key][i][2]]
create_fk(key, n2, n3, n4)
else:
[n2, n3, n4] = [d_fk[key][0], d_fk[key][1], d_fk[key][2]]
create_fk(key, n2, n3, n4)

Ce code retourne une erreur de syntaxe 1064,

Si vous avez des idées, elles sont bienvenues !
Merci

2 réponses

Avatar
Alain Ketterlin
Olivier92410 writes:
[...]
Ci-dessous, une partie du dictionnaire utilisé, pour rester simple:
d_fk = {'Bien_Immo': ['fk_Id_Lot', 'Lot', 'Id']}
Puis la fonction,
def create_fk(name1, name2, name3, name4):
url = "e;mysql+pymysql://{user}:{password}@localhost/{db}"e;
engine = create_engine(url.format(user='root', password='...',
db='data_immo'))

Ce n'est pas une bonne idée de poster un mot de passe sur Usenet.
engine.execute(f"e;ALTER TABLE {name1}"e;
f"e;ADD COLUMN {name2},"e;
f"e;ADD CONSTRAINT {name2}"e;
f"e;ADD FOREIGN KEY ({name2}) REFERENCES {name3}({name4})"e;
f"e;ON DELETE CASCADE"e;)

[...]
Ce code retourne une erreur de syntaxe 1064,

Note que ce n'est pas une erreur Python. (Et ce n'est effectivement pas
la syntaxe de MySQL, il n'y a pas de ADD avant FOREIGN KEY -- voir la doc.)
for key in d_fk.keys():
if isinstance(d_fk[key][0], list):
for i in range(len(d_fk[key])):
[n2, n3, n4] = [d_fk[key][i][0], d_fk[key][i][1], d_fk[key][i][2]]
create_fk(key, n2, n3, n4)
else:
[n2, n3, n4] = [d_fk[key][0], d_fk[key][1], d_fk[key][2]]
create_fk(key, n2, n3, n4)

1) Autant itérer sur les couples clé/valeur plutÍ´t que de multiplier les
accès au dictionnaire
2) Il est inutile de créer des listes dans les affectations
for key, val in d_fk.items():
if isinstance(val[0], list):
for i in range(len(val)):
n2, n3, n4 = val[i][0], val[i][1], val[i][2]
create_fk(key, n2, n3, n4)
else:
n2, n3, n4 = val[0], val[1], val[2]
create_fk(key, n2, n3, n4)
(items() en Python 3, iteritems() en Python 2).
Et utiliser soit un triplet soit une liste de triplets ne fait que
compliquer le code -- on peut utiliser une liste de longueur 1 dans le
premier cas, et en faire des triplets/tuples au lieu de listes, p.ex.
d_fk = {'Bien_Immo': [('fk_Id_Lot', 'Lot', 'Id')]}
Dans ce cas tu peux écrire
for key, val in d_fk.items():
for n2, n3, n4 in val:
create_fk(key, n2, n3, n4)
-- Alain.
Avatar
Nicolas
Bonjour,
Le 03/12/2021 Í  11:58, Olivier92410 a écrit :
Bonjour, Je veux insérer dans plusieurs tables une clé étrangère.

Etrangère Í  quoi ? ;)
Blague Í  part, c'est un peu léger comme description. Il faudrait au
moins préciser de quelle type de base de données il s'agit, s'il s'agit
bien d'une base de données.
Pour cela, j'ai créé un dictionnaire qui fournira Í  une fonction les paramètres
nécessaires Í  la création de ces clés.
Ci-dessous, une partie du dictionnaire utilisé, pour rester simple:
d_fk = {'Bien_Immo': ['fk_Id_Lot', 'Lot', 'Id']}
Puis la fonction,
def create_fk(name1, name2, name3, name4):
url = "e;mysql+pymysql://{user}:{password}@localhost/{db}"e;
engine = create_engine(url.format(user='root', password='Fer458it',
db='data_immo'))
engine.execute(f"e;ALTER TABLE {name1}"e;
f"e;ADD COLUMN {name2},"e;
f"e;ADD CONSTRAINT {name2}"e;
f"e;ADD FOREIGN KEY ({name2}) REFERENCES {name3}({name4})"e;
f"e;ON DELETE CASCADE"e;)
return
for key in d_fk.keys():
if isinstance(d_fk[key][0], list):
for i in range(len(d_fk[key])):
[n2, n3, n4] = [d_fk[key][i][0], d_fk[key][i][1], d_fk[key][i][2]]
create_fk(key, n2, n3, n4)
else:
[n2, n3, n4] = [d_fk[key][0], d_fk[key][1], d_fk[key][2]]
create_fk(key, n2, n3, n4)
Ce code retourne une erreur de syntaxe 1064,

Une erreur Python ou une erreur SQL ?
Si vous avez des idées, elles sont bienvenues !
Merci

Il faudrait fournir un code minimaliste complet et fonctionnel.
Avec les import qui vont bien.
Attention Í  l'indentation. Ici, on a un "return" qui est hors fonction.
Il y a des "e;" un peu partout dans le code. A quoi correspondent-ils ?
Globalement, il faut présenter un code utilisable directement par une
personne qui voudrait/pourrait aider.
Bonne journée,
Nicolas