#python #mysql #sqlalchemy
Вопрос:
Не удается создать таблицу ctfd
. discorduser
(ошибка: 150 «Неправильно сформировано ограничение внешнего ключа»)
CREATE TABLE discorduser ( id BIGINT NOT NULL AUTO_INCREMENT, username VARCHAR(128), discriminator INTEGER, avatar_hash VARCHAR(256), mfa_enabled BOOL, verified BOOL, email VARCHAR(256), PRIMARY KEY (id), UNIQUE (id), UNIQUE (id), FOREIGN KEY(username) REFERENCES users (name) ON DELETE CASCADE, CHECK (mfa_enabled IN (0, 1)), CHECK (verified IN (0, 1)) )
Модели определяются следующим образом:
class Users(db.Model): __tablename__ = "users" __table_args__ = (db.UniqueConstraint("id", "oauth_id"), {}) # Core attributes id = db.Column(db.Integer, primary_key=True) oauth_id = db.Column(db.Integer, unique=True) # User names are not constrained to be unique to allow for official/unofficial teams. name = db.Column(db.String(128)) password = db.Column(db.String(128)) email = db.Column(db.String(128), unique=True) type = db.Column(db.String(80)) secret = db.Column(db.String(128)) # Supplementary attributes website = db.Column(db.String(128)) affiliation = db.Column(db.String(128)) country = db.Column(db.String(32)) bracket = db.Column(db.String(32)) hidden = db.Column(db.Boolean, default=False) banned = db.Column(db.Boolean, default=False) verified = db.Column(db.Boolean, default=False) # Relationship for Teams team_id = db.Column(db.Integer, db.ForeignKey("teams.id")) field_entries = db.relationship( "UserFieldEntries", foreign_keys="UserFieldEntries.user_id", lazy="joined" ) created = db.Column(db.DateTime, default=datetime.datetime.utcnow) __mapper_args__ = {"polymorphic_identity": "user", "polymorphic_on": type} def __init__(self, **kwargs): super(Users, self).__init__(**kwargs) class DiscordUser(db.Model): __tablename__ = "discorduser" __table_args__ = (db.UniqueConstraint("id"), {}) # Core variables id = db.Column(db.BigInteger, primary_key=True, unique=True) # Discord ID, int64 # Discord Username 2-32 characters username = db.Column(db.String(128), db.ForeignKey("users.name", ondelete="CASCADE"))
Что может быть причиной этого? Тип имени пользователя одинаков для обоих, и у меня сложилось впечатление, что внешние ключи не нужно ограничивать.
Комментарии:
1. Предоставьте СОЗДАТЬ ТАБЛИЦУ для
users
. Колонкаname
должна бытьVARCHAR(128)
иUNIQUE
.2. Имя не является уникальным. Могу ли я вместо этого привязать таблицу к идентификатору?
3. Могу ли я вместо этого привязать таблицу к идентификатору? Ты должен, а не можешь. И
discorduser
соответствующим образом измените тип данных.4. Если я сделаю имя уникальным, смогу ли я сохранить
discorduser
то же самое?5. Столбец, на который вы ссылаетесь, должен быть однозначно проиндексирован. если нет, то вы получите сообщение об ошибке при попытке создать FK. И FK по столбцу строкового типа не очень хорошая идея — установите ссылку по
id
и получите соответствующее имя в запросе с правильным соединением.