我在python3.4.3上使用SqlAlchemy來管理MySQL數據庫。我創建一個表:SqlAlchemy TIMESTAMP'on update'額外
from datetime import datetime
from sqlalchemy import Column, text, create_engine
from sqlalchemy.types import TIMESTAMP
from sqlalchemy.dialects.mysql import BIGINT
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class MyClass(Base):
__tablename__ = 'my_class'
id = Column(BIGINT(unsigned=True), primary_key=True)
created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False)
updated_at = Column(TIMESTAMP, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
param1 = Column(BIGINT(unsigned=True), server_default=text('0'), nullable=False)
當我創建這個表:
engine = create_engine('{dialect}://{user}:{password}@{host}/{name}'.format(**utils.config['db']))
Base.metadata.create_all(engine)
我得到:
mysql> describe my_class;
+----------------+---------------------+------+-----+---------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------------+------+-----+---------------------+-----------------------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | |
| updated_at | timestamp | NO | | 0000-00-00 00:00:00 | |
| param1 | bigint(20) unsigned | NO | | 0 | |
現在的問題是,我不希望有任何on_update服務器在我的created_at
屬性上是默認的,它的目的實際上只是在創建記錄時才寫的,而不是在每次更新時寫的,正如課程的聲明中所述。
從幾個測試我做了,我發現,如果我created_at
前插入TIMESTAMP
類型的另一個屬性,那麼這個屬性得到on update CURRENT_TIMESTAMP
多餘的,而created_at
並不像期望的。這表明SqlAlchemy在映射聲明中發現的第一個TIMESTAMP
屬性獲得了額外的on update CURRENT_TIMESTAMP
,但我沒有看到任何此類行爲的原因。
我也曾嘗試:
created_at = Column(TIMESTAMP, default=datetime.utcnow, server_onupdate=None, nullable=False)
和
created_at = Column(TIMESTAMP, default=datetime.utcnow, server_onupdate=text(''), nullable=False)
,但問題仍然存在。 有什麼建議嗎?