2012-02-01 23 views
6

docs web2py có hai phương pháp để chèn vào một cơ sở dữ liệuphương pháp chèn web2py

db.tbl[0] = newRow 

db.tbl.insert(newRowAsDict) 

Các tài liệu ngụ ý rằng họ là từ đồng nghĩa, nhưng họ dường như khác nhau. Đối với một, phương thức chèn ném một ngoại lệ nếu newRow chứa các trường không có trong bảng. Ngoài ra phương thức .insert trả về id của hàng được thêm vào, trong đó nhiệm vụ không.

  • Đây có phải là hành vi có ý định
  • Làm thế nào tôi có thể nhận được id nếu tôi sử dụng phương pháp chuyển nhượng?
  • Phương pháp gán có được khắc phục không?

Trả lời

1

Một chút thăm dò cho thấy sự khác biệt giữa hai:

Mục đích: db.tbl[0] = dict(name='something')

File "/var/web2py/gluon/globals.py", line 172, in <lambda> 
    self._caller = lambda f: f() 
File "/var/web2py/applications/myapp/controllers/default.py", line 114, in test 
    db.tbl[0] = dict(name='something') 
File "/var/web2py/gluon/dal.py", line 5531, in __setitem__ 
    self.insert(**self._filter_fields(value)) 
File "/var/web2py/gluon/dal.py", line 5605, in insert 
    return self._db._adapter.insert(self,self._listify(fields)) 

Mục đích: db.tbl.insert(name='something')

File "/var/web2py/gluon/globals.py", line 172, in <lambda> 
    self._caller = lambda f: f() 
File "/var/web2py/applications/myapp/controllers/default.py", line 115, in test 
    db.tbl.insert(name='something') 
File "/var/web2py/gluon/dal.py", line 5605, in insert 
    return self._db._adapter.insert(self,self._listify(fields)) 

Cả hai người kết thúc cuộc gọi cùng một mã để làm chèn, vì vậy bạn sẽ thấy rằng họ chạy cùng một truy vấn:

INSERT INTO tbl(name) VALUES ('something'); 

Vì trước đây _filter_fields như được hiển thị rõ ràng từ dấu vết, nó không ném ngoại lệ khi có các trường không có trong bảng, trong khi trường còn lại không có.

Rõ ràng, db.tbl[0] = newRow không thể trả về giá trị. Bạn chỉ nên xem xét nó một cách viết tắt cho chèn và người anh em họ của nó db.tbl[x>0] là cực kỳ hữu ích cho các bản cập nhật và có ký hiệu chính xác giống nhau và điều này giúp đơn giản hóa mã.

2
  • Đây có phải là hành vi có ý định

Dựa trên mã này, nó dường như là. Sử dụng phương thức gán, các trường được lọc để nó chỉ cố gắng chèn các trường thuộc về bảng. Điều này không xảy ra với phương pháp tiêu chuẩn insert().

  • Làm cách nào để nhận id nếu tôi sử dụng phương pháp gán?

Nếu bạn cần id, có lẽ bạn nên sử dụng phương pháp insert().

  • Phương pháp gán có được khắc phục không?

Tôi không nghĩ vậy.

4

Ngoài ra còn có

db.tbl.insert(**db.tbl._filter_fields(newRowAsDict)) 

mà sẽ lọc các phím trong newRowAsDict bỏ qua lĩnh vực chưa rõ.

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