【问题标题】:Psycopg2 to create a record using a foreign keyPsycopg2 使用外键创建记录
【发布时间】:2016-06-27 11:44:09
【问题描述】:

我正在运行以下版本的软件:

Python 3.5
psycopg2==2.6.1
Postgres 9.4.5

我有 2 张桌子。表User 具有UserId (serial PK)LastNameFirstNameGenderDateOfBirthDateEnrolled。表UserProfile 具有UserProfileId (serial, PK)UserId (FK)DateEnteredFaveNumberActivity。存在一对多关系。

以下 PostgreSQL 工作并最终在 UserProfile 中创建一条具有关联 UserId (FK) 的记录。

\set last_name '''Sara'''
\set first_name '''Jackson'''
\set gender '''F'''
\set dob '''1941-1-12'''
\set fave_number '''3''' 
\set activity '''volleyball'''


WITH ins_user AS (
INSERT INTO User
(LastName, FirstName, Gender, DateOfBirth, DateEnrolled)
VALUES (:last_name, :first_name, :gender, :dob, now())
RETURNING UserId)
INSERT INTO UserProfile
(UserId, DateEntered, FaveNumber, Activity) 
VALUES ( (SELECT UserId FROM ins_user), now(), :fave_number :activity);

如何构建一个 psycopg2 cur.execute 查询来完成上述 PostgreSQL?我已经阅读了文档,但似乎无法理解我应该如何构建这个命令。

我的出发点是:

cur.execute( \
"""INSERT INTO User \
(LastName, FirstName, Gender, DateOfBirth, DateEnrolled) \
VALUES (%s, %s, %s, %s, %s) RETURNING UserId;""", \
(last_name, first_name, gender, date_of_birth, now(), ??...??)

此外,是否可以提取从RETURNING UserId 派生的值,以便在以后的查询中使用它?

感谢您的宝贵时间!

【问题讨论】:

    标签: python sql database postgresql psycopg2


    【解决方案1】:

    使用字典传递参数更清晰

    ins = """
        with ins_user as (
            insert into User (
                LastName, FirstName, Gender, DateOfBirth, DateEnrolled
            ) values (%(last_name)s, %(first_name)s, %(gender)s, %(dob)s, now())
            returning UserId
        )
        insert into UserProfile (
            UserId, DateEntered, FaveNumber, Activity
        ) values ((select UserId from ins_user), now(), %(fave_number)s, %(activity)s)
    """
    
    ins_dict = dict (
        last_name = 'Sara',
        first_name = 'Jackson',
        gender = 'F',
        dob = '1941-1-12',
        fave_number = '3',
        activity = 'volleyball'
    )
    print cur.mogrify(ins, ins_dict) # inspect the rendered command
    cur.execute(ins, ins_dict)
    connection.commit()
    

    如果DateEnrolled 将始终接收now(),则将其设为默认值

    DateEnrolled date default now(),
    

    【讨论】:

    • > 感谢您的回复。我不知道我可以将字典作为参数传递给 cur.execute。 +1 将 date now() 设置为表格中的默认值!
    【解决方案2】:
    cur.execute( \
    """INSERT INTO User \
    (LastName, FirstName, Gender, DateOfBirth, DateEnrolled) \
    VALUES (%s, %s, %s, %s, %s) RETURNING UserId;""", \
    (last_name, first_name, gender, date_of_birth, now(), ??...??)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      相关资源
      最近更新 更多