【问题标题】:How to insert into a ForeignKey field using raw SQL?如何使用原始 SQL 插入 ForeignKey 字段?
【发布时间】:2011-04-26 09:27:20
【问题描述】:

我有如下表(Django 模型定义,下面有一个 postgres 数据库):

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) 

我使用 Python 脚本从 CSV 文件设置我的数据库。原始文件列出了具有整数 id 和整数“person”字段的所有者,该字段映射到 Person.id 中的整数。

但是,鉴于 Owner 中的“person”列需要一个 Person 对象,我该如何编写一个原始 SQL 字符串来将值插入 Owner?

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

【问题讨论】:

  • 为什么sql_string = 'INSERT INTO owner (structidx, person) VALUES (' + sql_string += owner_id + ', ' + person_id + ');' 还不够?只要确保先插入所有 Person 对象,就不会违反 ForeignKey 约束。

标签: sql django postgresql


【解决方案1】:

您没有说明为什么需要在原始 SQL 中执行此操作。而且我也不明白为什么当您的PK字段称为id时您在SQL中使用structidxperson - 并且person的基础列名称是person_id。所以你的代码应该是:

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

请注意,使用 Python db-api 的引用功能(如我在此处使用的)来避免 SQL 注入攻击始终是一种好习惯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2015-11-30
    • 2020-12-04
    • 2021-11-04
    相关资源
    最近更新 更多