Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Débuter
Débuter Forum d'entraide : Débuter en base de données avec PostgreSQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 15/12/2011, 12h27   #1
tom77380
Futur Membre du Club
 
Tulate Leke
Inscription : janvier 2010
Messages : 53
Détails du profil
Informations personnelles :
Nom : Tulate Leke

Informations forums :
Inscription : janvier 2010
Messages : 53
Points : 15
Points : 15
Par défaut Conflit de clées étrangères

Bonjour,

Je dispose de 2 tables que voici
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE TABLE POSITION(
NumeroChr VARCHAR(25),
IdEnsembl VARCHAR(25),
...
...
FOREIGN KEY (NumeroChr) REFERENCES CHROMOSOME(NumeroChr),
FOREIGN KEY (IdEnsembl) REFERENCES GENE(IdEnsembl));
 
 
 
CREATE TABLE CHROMOSOME(
NumeroChr VARCHAR(25),
Taille INT CHECK(Taille >= 0),
PRIMARY KEY (NumeroChr));
Voici mon problème, je commence par insérer mes données dans la table chromosome, cela ne pause aucun problème. Mais lorsque je tente de remplir ma table POSITION, j'obtiens le message d'erreur suivant :

Citation:
psycopg2.IintegrityError:insert or update on table "position" violate foreign key constraint "position_numeroChr_fkey"
DETAIL: Key (numerochr) = ("X"') is not present in table "CHROMOSOME".
Pourtant les chromosome (1,2,3... ect) sont bien implémentés dans la table position, le chromosome X est lui bel et bien présent dans la table CHROMOSOME, mais ne s'implémente pas la table POSITION, je ne comprends pas pourquoi, si vous avez une idée je suis preneur
tom77380 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 13h58   #2
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 161
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 161
Points : 3 494
Points : 3 494
Citation:
DETAIL: Key (numerochr) = ("X"') is not present in table "CHROMOSOME".
Bonjour,

Pour moi vous avez un problème de quote ou double quote (qui encadre le X)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h11   #3
tom77380
Futur Membre du Club
 
Tulate Leke
Inscription : janvier 2010
Messages : 53
Détails du profil
Informations personnelles :
Nom : Tulate Leke

Informations forums :
Inscription : janvier 2010
Messages : 53
Points : 15
Points : 15
Désolé j'ai recopié le message d'erreur à la main, le X est entouré uniquement de double quote:


tom77380 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h17   #4
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 161
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 161
Points : 3 494
Points : 3 494
quel est votre requête d'insert ?
Ceci devrait marcher sans problème, je reste sur ma 1ere pensée => problème avec des quote en trop
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h33   #5
hariman
Membre éprouvé
 
Avatar de hariman
 
Homme Luc Hariman RANDRIANOMENJANAHARY
Développeur Java, Android
Inscription : janvier 2008
Messages : 199
Détails du profil
Informations personnelles :
Nom : Homme Luc Hariman RANDRIANOMENJANAHARY
Localisation : Ile Maurice

Informations professionnelles :
Activité : Développeur Java, Android
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2008
Messages : 199
Points : 417
Points : 417
Bonjour,

Cette erreur survient quand on crée un enregistrement avec une valeur inexistante pour une clé etrangère.

Vérifie si la table POSITION contient bien un enregistrement avec NumeroChr = "X".
hariman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h45   #6
tom77380
Futur Membre du Club
 
Tulate Leke
Inscription : janvier 2010
Messages : 53
Détails du profil
Informations personnelles :
Nom : Tulate Leke

Informations forums :
Inscription : janvier 2010
Messages : 53
Points : 15
Points : 15
Je ne suis pas au travail actuellement, je vous montrerai la requête en fin d'après midi.

Citation:
Vérifie si la table POSITION contient bien un enregistrement avec NumeroChr = "X".
Justement c'est quand je veux insérer la valeur X avec un script dans ma table POSITION que je reçois ce message d'erreur, alors que les autres valeurs de humerochr s'implémentent correctement, et le type de numerochr est VARCHAR, cela devrait marcher :/
tom77380 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 17h37   #7
tom77380
Futur Membre du Club
 
Tulate Leke
Inscription : janvier 2010
Messages : 53
Détails du profil
Informations personnelles :
Nom : Tulate Leke

Informations forums :
Inscription : janvier 2010
Messages : 53
Points : 15
Points : 15
Voici mon script python permettant l'insertion (avec la requête d'insertion):







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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
 
#!/usr/bin/python
 
# Import des modules python pour postgresql
import psycopg2
import psycopg2.extras
 
 
 
# Programme de lecture du fichier biomart.txt 
# de decoupage des informations pour les mettres dans la table Position
# de notre base de donnees.
 
 
# Programme Principal
IF __name__ == '__main__':
 
    # Entrer le nom du schema de la base!
    schema = raw_input("Entrez le nom du schema de la base [public] : ")
    # Par defaut le nom du schema sera cours
    IF schema == "":                # l'utilisateur n'a rien rentre
        schema="public"     # alors schema=public par defaut
 
 
 
    geneFileName = raw_input("Entrez le nom du fichier contenant \
la liste des genes [biomart.txt] : ")
 
    # Par defaut le nom du fichier a lire sera gene.txt
    IF geneFileName == "":          # l'utilisateur n'a rien rentre
        geneFileName="biomart.txt"     # alors genefilename=valeur par defaut
 
    print geneFileName
 
    # On ouvre le fichier que l'on veut lire!
    geneFile = open(geneFileName,"r")    # r indique lecture
 
    # Lecture d'un ligne dans le fichier des genes
    # Lecture de la premiere ligne avec les noms de colonnes
    ligne = geneFile.readline()
 
    # connection a la base de donnees pour permettre l'insertion des genes
    try:
        # Connecteur a la base de donnees
        connecteur = psycopg2.connect("dbname='ma_base' host='localhost' user='postgres' password='slivoide'")
        cur = connecteur.cursor(cursor_factory=psycopg2.extras.DictCursor)
 
    except Exception, e:
            print "<h1>Erreur lors de l'execute</h1>"
            print e.pgcode
            print e.pgerror
 
 
 
    # Lecture des lignes suivantes avec les informations sur les positions.
    FOR ligne IN geneFile.readlines():
        ligne = ligne.rstrip('\n') # on retire le dernier caractere (retour chariot)
 
        cols = ligne.split('	')    # Decoupage de la ligne pour recuperer les differents elements
        idensembl  = cols[0]       # Colonne 0 le nom du gene
        numerochr = cols[1]        # Colonne 1 le numero de chromosome
        debut = cols[2]     
        fin = cols[3]
	sens = cols[7]
 
        #
        requetePosition = "insert into "+schema+".position (numerochr,idensembl,debut,fin,sens) values ('"+str(numerochr)+"','"+str(idensembl)+"','"+str(debut)+"','"+str(fin)+"','"+str(sens)+"')";
 
 
 
        # Maintenant on peut inserer les positions
        cur.execute(requetePosition)
       	connecteur.commit()
 
 
 
 
    geneFile.close();
tom77380 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 22h38   #8
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 161
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 161
Points : 3 494
Points : 3 494
votre probleme releve du python (ou des données de votre fichier .txt) et non de pgsql. si vous faites cette insert à la main, via pgadmin par exemple, il marchera sans problème.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h13.


 
 
 
 
Partenaires

Hébergement Web