MySQL データベースを管理するために python3.4.3 で SqlAlchemy を使用しています。私はテーブルを作成していました:
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
。実際、その目的は、クラスの宣言で述べられているように、すべての更新ではなく、レコードの作成時にのみ書き込まれることです。
私が行ったいくつかのテストから、 type の別の属性を のTIMESTAMP
前に挿入するcreated_at
と、この属性は必要に応じてon update CURRENT_TIMESTAMP
余分に取得されますが、取得created_at
されないことに気付きました。これはTIMESTAMP
、マッピングの宣言で SqlAlchemy が最初に見つけた属性が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)
しかし、問題は解決しません。なにか提案を?