比较来自世界各地的卖家的域名和 IT 服务价格

SqlAlchemy TIMESTAMP 'on update' 此外

我用 SqlAlchemy 在 python3.4.3 管理数据库 MySQL. 我创建了一个表:


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

, 事实上,它的作业才会在创建记录时录制,而不是在类声明中所示。

从几个测试中,我注意到了 , 如果我插入另一个类型属性
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/


但问题仍然存在。
你有一些想法吗?
已邀请:

石油百科

赞同来自:

显然,问题没有连接 SqlAlchemy, 和底层发动机 MySQL. 默认行为是建立
on update CURRENT_TIMESTAMP

在第一列中 TIMESTAMP 表。

描述了这种行为
http://dev.mysql.com/doc/refma ... stamp
. 据我所知,可能的解决方案是开始 MySQL 旗帜
--explicit_defaults_for_timestamp=FALSE

. 可以找到另一种解决方案

. 我还没有尝试过任何解决方案,我会尽快改变这个答案。

EDIT: 我尝试了第二种方法,它不是很方便,但它有效。 在我的情况下,我创建了一组没有属性的表
created_at

, 然后将所有其他表格更改如上面的链接中所述。

沿线的东西:


_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: 其他 /更简单/ 做它的方式 - 安装 SqlAlchemy 价值
server_default

对于列:


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

窦买办

赞同来自:

我遇到了同样的问题,你可以用:


created_time = Column/TIMESTAMP, nullable=False, server_default=func.now///
updated_time = Column/TIMESTAMP, nullable=False, server_default=text/'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'//

要回复问题请先登录注册