如何更改SQLAlchemy UniqueConstraint大小,默认为64字节?

时间:2015-12-17 06:26:06

标签: python mysql sqlalchemy

我正在尝试在我的应用程序中设置基于角色权限的授权。我的许多表格之一(角色,权限,用户等)的模型如下所示

class UserRole(Model):

    __tablename__ = 'user_role'

    id = Column(String(36), primary_key=True, default=_generate_unique_business_id)
    user_id = Column(String(36), ForeignKey('user.id'), nullable=False)
    role_id = Column(String(36), ForeignKey('role.id'), nullable=False)

    created_on = Column(DateTime, default=_get_date_time)
    modified_on = Column(TIMESTAMP, nullable=False, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"))
    deleted_on = Column(DateTime)

    __table_args__ = (UniqueConstraint('user_id', 'role_id', name='_user_role_uc'),)

注意 - 我的表格中的主键是Strings,因为我将UUIDs放在那里。

现在我的授权已准备就绪,我想让它向后兼容。为此,我想使用role_permissionuser表填充role表中的行。所以我决定手动运行insert查询。

INSERT INTO user_role (id, user_id, role_id, created_on) SELECT uuid(), user.id, 'e5d7454f-a58b-4a0d-acae-074890dadb84', now() FROM user;

但我收到错误

Error Code: 1062. Duplicate entry '604fdff9-a402-11e5-b430-28d24442d3e7-e5d7454f-a58b-4a0d-acae-074' for key '_user_role_uc'

理想情况下,这不应该发生。

当我比较这个唯一约束的预期和实际大小时,我发现了

expected = size of user id + size of role id
         = '604fdff9-a402-11e5-b430-28d24442d3e7' + '-' + 'e5d7454f-a58b-4a0d-acae-074890dadb84'
         = 36+36 = 72
actual   = size of '604fdff9-a402-11e5-b430-28d24442d3e7-e5d7454f-a58b-4a0d-acae-074' = 64 

为什么会出现差异?唯一约束的默认大小是64个字节/字节吗?即使这是什么问题?如何修改?我看了sqlalchemy-doc,但没找到方法。

除了这种差异,我无法想到任何其他原因。请帮忙。

0 个答案:

没有答案