2010-10-16 9 views
3

J'ai des tables comme les suivantes (définition du modèle Django, avec une base de données postgres sous-tend):Comment insérer dans un champ ForeignKey en utilisant SQL brut?

class Person(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=300)  
class Owner(models.Model): 
    id = models.IntegerField() 
    person = models.ForeignKey(Person) 

J'utilise un script Python pour configurer ma base de données à partir de fichiers CSV. La liste des fichiers bruts Propriétaires avec un identifiant entier et un champ entier 'person', qui correspond à l'entier dans Person.id.

Cependant, étant donné que la colonne 'personne' du propriétaire attend un objet Personne, comment puis-je écrire une chaîne SQL brute pour insérer une valeur dans Owner?

owner_id = 665 
person_id = 330 
sql_string = 'INSERT INTO owner (id, person) VALUES (' + 
sql_string += owner_id + ', ' + ???? + ');' 
+0

Pourquoi 'sql_string =' INSERT INTO propriétaire (structidx, person) VALEURS ('+ sql_string + = owner_id +', '+ person_id +'); '' assez? Assurez-vous simplement d'insérer tous les objets Person en premier afin de ne pas violer la contrainte ForeignKey. – OmerGertel

Répondre

1

Vous ne dites pas pourquoi vous avez besoin de faire cela en SQL brut. Et je ne comprends pas non plus pourquoi vous utilisez structidx et person dans le SQL lorsque votre champ PK est appelé id - et le nom de colonne sous-jacente pour person est person_id. Donc, votre code devrait être:

sql_string = "INSERT INTO owner (`id`, `person_id`) VALUES (%s, %s)" 
cursor = connection.cursor() 
cursor.execute(sql_string, (665, 330)) 

Notez qu'il est toujours bon d'utiliser la fonctionnalité citant le Python db-api, comme je l'ai ici, pour éviter les attaques par injection SQL.

Questions connexes