【问题标题】:Can't create_all Flask-SQLAlchemy - specified key was too longCan't create_all Flask-SQLAlchemy - 指定的键太长
【发布时间】:2017-04-14 12:38:13
【问题描述】:

当我尝试运行 db.create_all() 来创建 MySQL 表时,我收到以下错误:

sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1071, 'Specified key was too long; max key length is 767 bytes') [SQL: '\nCREATE TABLE post (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\tblog_id INTEGER, \n\tuser_id INTEGER, \n\ttitle VARCHAR(80), \n\tbody TEXT, \n\timage VARCHAR(255), \n\tslug VARCHAR(256), \n\tpublish_date DATETIME, \n\tlive BOOL, \n\ttag_id INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(blog_id) REFERENCES blog (id), \n\tFOREIGN KEY(user_id) REFERENCES user (id), \n\tUNIQUE (slug), \n\tCHECK (live IN (0, 1)), \n\tFOREIGN KEY(tag_id) REFERENCES tag (id)\n)\n\n']

如何解决此错误?我不确定问题的根源。我可以在我的开发环境中create_all() 数据库,但不能在我的主机上。我假设这是对服务器 MySQL 服务的列大小限制。我是否对表格内容进行了低效编码?我是否错误地构建了模型? 我试图改变我的settings.py

DB_URI = "mysql+pymysql://%s:%s@%s/%s?charset=utf8" % (DB_USERNAME, DB_PASSWORD, DB_HOST, BLOG_DATABASE_NAME)

我还尝试将SET @@global.innodb_large_prefix = 1; 用作this question suggested


型号

from my_app import db, uploaded_images
from datetime import datetime

class Blog(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    admin = db.Column(db.Integer, db.ForeignKey('user.id'))
    posts = db.relationship('Post', backref='blog', lazy='dynamic')

    def __init__(self, name, admin):
        self.name = name
        self.admin = admin

    def __repr__(self):
        return '<Name %r>' % self.name

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    blog_id = db.Column(db.Integer, db.ForeignKey('blog.id'))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    title = db.Column(db.String(80))
    body = db.Column(db.Text)
    image = db.Column(db.String(255))
    slug = db.Column(db.String(256), unique=True)
    publish_date = db.Column(db.DateTime)
    live = db.Column(db.Boolean)

    tag_id = db.Column(db.Integer, db.ForeignKey('tag.id'))
    tag = db.relationship('Tag',
        backref=db.backref('posts', lazy='dynamic'))

    @property
    def imgsrc(self):
        return uploaded_images.url(self.image)

    def __init__(self, blog, user, title, body, tag, image=None, slug=None, publish_date=None, live=True):
            self.blog_id = blog.id
            self.user_id = user.id
            self.title = title
            self.body = body
            self.tag = tag
            self.image = image
            self.slug = slug
            if publish_date is None:
                self.publish_date = datetime.utcnow()
            self.live = live

    def __repr__(self):
        return '<Post %r>' % self.title


class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return self.name

from my_app import db
from blog.models import Post
from datetime import datetime
import datetime


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    fullname = db.Column(db.String(80))
    email = db.Column(db.String(35), unique=True)
    username = db.Column(db.String(25), unique=True)
    password = db.Column(db.String(60))
    paid_until = db.Column(db.DateTime, default=datetime.datetime.utcnow)

    posts = db.relationship('Post', backref='user', lazy='dynamic')

    def __init__(self, fullname, email, username, password):
        self.fullname = fullname
        self.email = email
        self.username = username
        self.password = password

    def __repr__(self):
        return '<User %r>' % self.username

谢谢。

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

    嗯,这个问题实际上是由课程中的学生回答的。问题是slug 上的索引(当您将其标记为 UNIQUE 时,它正在创建索引)。

    因为它是一个varchar,MySQL中索引列的最大字符串长度是255。如果slug是utf8,那么我们需要假设更短的长度(255/3 = 85 chars max,因为每个utf8字符是3字节)。

    因此,只需将 slug 上的 varchar 大小减少到 256 个字符以下(学生提到 252 个有效)。

    这里有一个Stack Overflow discussion 讨论这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 2015-09-13
      相关资源
      最近更新 更多