如何让 Alembic 在 TEXT 列上发出长度约束?
How do I get Alembic to emit a length constraint on a TEXT column?
我不确定它是否真的被称为“长度约束”,但我有一个 SQL 语句在使用 mysql 在本地 docker 容器中测试时有效:
create unique index _uq_data on data(question_id, reply_id, text(50));
constraint/length 符号 (50)
是必需的,因为 TEXT 字段是可变长度的,可能会使密钥太长。为此创建 Flask 迁移时,我尝试了:
op.create_unique_constraint('_data_uc', 'data', ['question_id', 'reply_id', 'text(50)'])
但是 Alembic 为此生成的 SQL 引用了整个最后一个字段:
ALTER TABLE data ADD CONSTRAINT _data_uc UNIQUE (question_id, reply_id, `text(50)`);
给出了错误
ERROR 1072 (42000): Key column 'text(50)' doesn't exist in table
如何将其作为 'text'(50)
而不是 'text(50)'
发出?
我最近遇到了同样的问题,我考虑了 2 solutions/workarounds。
第一个解决方案
更改您的列以指定它们的长度。在您的情况下,这些列似乎是 ID(作为文本),它们会比 X 个字符长吗?
第二种解决方案
create_index
函数允许various things in the columns list,包括TextClause
。所以你可以创建一个 non unique index with only a part of the IDs, such as :
from sqlalchemy.sql.expression import text
from alembic import op
def upgrade():
op.create_index(
"_uq_data",
"data",
# 100 is arbitrary, but there is a limit to index key length
# depending on your mysql version and database configuration
[text("question_id(100)"), text("reply_id(100)")],
unique=False
)
导致以下 SQL 语句:
CREATE INDEX _uq_data ON data (question_id(100), reply_id(100))
备选的第二种解决方案
仍在创建“部分值索引”,但是通过 sqlalchemy 使用 mysql dialect param mysql_length
:
Index(
"_uq_data",
"question_id",
"reply_id",
unique=False,
mysql_length={"question_id": 100, "reply_id": 100},
),
我不确定它是否真的被称为“长度约束”,但我有一个 SQL 语句在使用 mysql 在本地 docker 容器中测试时有效:
create unique index _uq_data on data(question_id, reply_id, text(50));
constraint/length 符号 (50)
是必需的,因为 TEXT 字段是可变长度的,可能会使密钥太长。为此创建 Flask 迁移时,我尝试了:
op.create_unique_constraint('_data_uc', 'data', ['question_id', 'reply_id', 'text(50)'])
但是 Alembic 为此生成的 SQL 引用了整个最后一个字段:
ALTER TABLE data ADD CONSTRAINT _data_uc UNIQUE (question_id, reply_id, `text(50)`);
给出了错误
ERROR 1072 (42000): Key column 'text(50)' doesn't exist in table
如何将其作为 'text'(50)
而不是 'text(50)'
发出?
我最近遇到了同样的问题,我考虑了 2 solutions/workarounds。
第一个解决方案
更改您的列以指定它们的长度。在您的情况下,这些列似乎是 ID(作为文本),它们会比 X 个字符长吗?
第二种解决方案
create_index
函数允许various things in the columns list,包括TextClause
。所以你可以创建一个 non unique index with only a part of the IDs, such as :
from sqlalchemy.sql.expression import text
from alembic import op
def upgrade():
op.create_index(
"_uq_data",
"data",
# 100 is arbitrary, but there is a limit to index key length
# depending on your mysql version and database configuration
[text("question_id(100)"), text("reply_id(100)")],
unique=False
)
导致以下 SQL 语句:
CREATE INDEX _uq_data ON data (question_id(100), reply_id(100))
备选的第二种解决方案
仍在创建“部分值索引”,但是通过 sqlalchemy 使用 mysql dialect param mysql_length
:
Index(
"_uq_data",
"question_id",
"reply_id",
unique=False,
mysql_length={"question_id": 100, "reply_id": 100},
),