Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP 'trên bản cập nhật' bổ sung

Rõ ràng vấn đề không liên quan đến SqlAlchemy mà là với MySQL engine bên dưới. Hành vi mặc định là đặt on update CURRENT_TIMESTAMP trên cột TIMESTAMP đầu tiên trong bảng.

Hành vi này được mô tả tại đây . Theo như tôi hiểu, một giải pháp khả thi là khởi động MySQL với --explicit_defaults_for_timestamp=FALSE lá cờ. Một giải pháp khác có thể được tìm thấy tại đây . Tôi vẫn chưa thử một trong hai giải pháp, tôi sẽ cập nhật câu trả lời này ngay khi tôi giải quyết được vấn đề.

CHỈNH SỬA:Tôi đã thử phương pháp thứ hai và nó không tiện dụng lắm nhưng nó hoạt động. Trong trường hợp của tôi, tôi đã tạo một tập hợp các bảng không có created_at và sau đó tôi đã thay đổi tất cả các bảng còn lại như được mô tả trong liên kết ở trên.

Vài nét về:

_no_alter = set(['tables', 'which', 'do not', 'have', 'a created_at', 'column'])
Base.metadata.create_all(engine)
for table in Base.metadata.tables.keys():
    if table not in _no_alter:
      engine.execute(text('ALTER TABLE {} MODIFY created_at TIMESTAMP NOT NULL DEFAULT 0'.format(table)))

EDIT2:một cách khác (dễ dàng hơn) để thực hiện điều này là đặt trong SqlAlchemy một server_default giá trị cho cột:

created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jsp hiển thị số lượng hàng ngẫu nhiên từ cơ sở dữ liệu

  2. So sánh ngày giờ của MySQL với hàng trước

  3. Cách nhanh nhất để tải tệp XML vào MySQL bằng C # là gì?

  4. Cột 'user_id' trong danh sách trường không rõ ràng

  5. PHP / mysql - Làm thế nào để chuyển các biến từ lớp sang index.php riêng biệt? Các trang hồ sơ?