Câu trả lời:
Mã mẫu của bạn lẽ ra phải hoạt động như bình thường. SQLAlchemy nên cung cấp một giá trị cho f.id
, giả sử nó là cột khóa chính tự động tạo. Các thuộc tính khóa chính được điền ngay trong flush()
quy trình khi chúng được tạo và không cần gọi tới commit()
. Vì vậy, câu trả lời ở đây nằm trong một hoặc nhiều điều sau:
Tôi vừa gặp phải vấn đề tương tự và sau khi kiểm tra, tôi nhận thấy rằng KHÔNG CÓ câu trả lời nào trong số các câu trả lời này là đủ.
Hiện tại, hoặc kể từ sqlalchemy .6+, có một giải pháp rất đơn giản (tôi không biết liệu điều này có tồn tại trong phiên bản trước hay không, mặc dù tôi tưởng tượng là có):
session.refresh ()
Vì vậy, mã của bạn sẽ trông giống như sau:
f = Foo(bar=x)
session.add(f)
session.flush()
# At this point, the object f has been pushed to the DB,
# and has been automatically assigned a unique primary key id
f.id
# is None
session.refresh(f)
# refresh updates given object in the session with its state in the DB
# (and can also only refresh certain attributes - search for documentation)
f.id
# is the automatically assigned primary key ID given in the database.
Đó là cách thực hiện.
sessionmaker(autoflush=True)
, tổ hợp w / refresh () đó đã cung cấp cho tôi ID hàng. #grrr
flush()
và commit()
dưới đây là một lời giải thích tốt: stackoverflow.com/a/4202016/1252290
flush()
sử dụng commit()
và ngay sau đó - làm mới nó với session.refresh(f)
, làm việc cho tôi, và tôi sử dụng phiên bản SQLAlchemy0.6.7
Cảm ơn tất cả mọi người. Tôi đã giải quyết vấn đề của mình bằng cách sửa đổi ánh xạ cột. Đối với tôi, autoincrement=True
là bắt buộc.
gốc:
id = Column('ID', Integer, primary_key=True, nullable=False)
sau khi sửa đổi:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
sau đó
session.flush()
print(f.id)
là ok!
không giống như câu trả lời được đưa ra bởi dpb, làm mới là không cần thiết. khi bạn xóa, bạn có thể truy cập trường id, sqlalchemy sẽ tự động làm mới id được tạo tự động tại phần phụ trợ
Tôi gặp phải sự cố này và đã tìm ra lý do chính xác sau một số cuộc điều tra, mô hình của tôi được tạo với id là trường số nguyên và ở dạng của tôi, id được đại diện bằng hiddenfield (vì tôi không muốn hiển thị id trong biểu mẫu của mình). Trường ẩn theo mặc định được biểu diễn dưới dạng văn bản. khi tôi thay đổi biểu mẫu thành trường số nguyên với widget = hiddenInput ()) thì vấn đề đã được giải quyết.
Bạn nên thử sử dụng session.save_or_update(f)
thay vì session.add(f)
.
save_or_update
đã không được chấp nhận kể từ 0,5 trở lên. session.add()
Hãy làm nó.
echo=True
, và xem những gì SQL được thực thi tại thời điểm không? Những gì bạn mô tả sẽ hoạt động và cung cấp cho bạn id, nhưng có thể có một số vấn đề khác dẫn đến f.id là Không có.