2011-12-21 52 views
13

Tôi đang sử dụng SQLAlchemy không có ORM, tức là sử dụng các biểu tượng SQL được tạo thủ công để tương tác trực tiếp với db phụ trợ. Tôi đang sử dụng PG như db phụ trợ của tôi (psycopg2 như trình điều khiển DB) trong trường hợp này - Tôi không biết nếu điều đó ảnh hưởng đến câu trả lời.SqlAlchemy: lấy id của hồ sơ cuối cùng được chèn

Tôi có báo cáo như thế này (cho ngắn gọn, giả conn đó là một kết nối hợp lệ đến db):

conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)") 

cũng Giả sử rằng các bảng người dùng bao gồm các cột (id [SERIAL PRIMARY KEY], tên, country_id)

Làm thế nào tôi có thể lấy id của người dùng mới (lý tưởng, mà không va vào db nữa không?)

+0

Điều này có liên quan gì với SQLAlchemy? –

Trả lời

14

Bạn có thể có thể sử dụng RETURNING khoản của INSERT statement như thế này:

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123) 
         RETURNING *") 

Nếu bạn chỉ muốn kết quả id:

rslt_id = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123) 
         RETURNING id") 
+1

Chắc chắn những gì tôi cần. Đối tượng trả về là một ResultProxy trong cả hai trường hợp, vì vậy tôi đã phải sửa đổi mã một chút (bằng cách gọi hàm fetchone()) để làm cho nó hoạt động. –

+7

Cách khác, 'user.insert(). Return (user.c.id) .values ​​({'name': 'Homer', 'country_id': 123})' – Pakman

+0

Giải pháp này không hoạt động với 'sqlite'. Nó dẫn đến 'sqlalchemy.exc.CompileError: RETURNING không được trình biên dịch câu lệnh của phương ngữ này hỗ trợ. Các giải pháp khác ('lastrowid') hoạt động trong trường hợp đó. –

13

tài lastrowid

result = conn.execute("INSERT INTO user (name, country_id) VALUES ('Homer', 123)") 
result.lastrowid 
+3

Điều này không hoạt động với PG db bằng trình điều khiển psycopg2. –

+0

Xin lỗi tôi không có pgsql tại bàn của tôi, tôi đã sử dụng mysql :) – Nilesh

+6

Cụ thể hơn, nó không hoạt động với các bảng không có oid, mà hiện tại là mặc định. Và dù sao nó thường không phải là oid bạn đang tìm kiếm: RETURNING là một giải pháp cao cấp. – piro

0

hiện SQLAlchemy documentation gợi ý

result.inserted_primary_key nên làm việc!

Các vấn đề liên quan