2016-03-12 36 views
0

創造了紀錄我運行的軟件,以下版本:Psycopg2使用外鍵

Python 3.5 
psycopg2==2.6.1 
Postgres 9.4.5 

我有2個表。表User具有UserId (serial PK),LastName,FirstName,Gender,DateOfBirthDateEnrolled。表UserProfile具有UserProfileId (serial, PK),UserId (FK),DateEntered, FaveNumberActivity。有一對多的關係。

以下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衍生該值,以便它可以在後面的查詢中使用?

謝謝你的時間!

回答

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(), 
+0

>爲響應感謝。我不知道我可以將字典作爲參數傳遞給cur.execute。 +1表示現在將日期設置爲()作爲表中的默認值! – Aaron

-1
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(), ??...??)