標籤:sqlalchemy.exc.internalerror: (internalerror) (1071 u'specified key was too long; max key length is 767 bytes')
$ cat models/user.py#!/usr/bin/env python# encoding: utf-8__author__ = ‘Andy‘from extensions import dbfrom datetime import datetimeclass User(db.Model): __tablename__ = ‘user‘ _id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(256), nullable=False, unique=True) zh_name = db.Column(db.String(256), nullable=True) password = db.Column(db.String(256), nullable=False) _type = db.Column(db.Integer, nullable=False, default=1 ) #COMMENT=‘1 is User;2 is Admin, 3 is SuperAdmin‘ sex = db.Column(db.Enum(‘M‘, ‘F‘), nullable=False) email = db.Column(db.String(256), nullable=True, unique=True) favicon= db.Column(db.String(1024)) create_time = db.Column(db.DateTime, nullable=False, default=datetime.now()) last_update = db.Column(db.DateTime(), nullable=False, default=datetime.now())
執行建表
sudo python manage.py db_setup
報錯
sqlalchemy.exc.InternalError: (InternalError) (1071, u‘Specified key was too long; max key length is 767 bytes‘)
原因:
將欄位設定成為unique後mysql會自動將唯一性索引建立在該欄位上,,而對於維護唯一性索引又會存在著系統開銷,所以就會出現這種問題,一方面提供唯一性索引,另外避免維護過長的索引造成的開銷問題。
另外在mysql中還有一個問題必須注意,那就是utf-8預設是一個字元佔用三個位元組,對於GBK這些編碼方式佔用的是2個位元組,因此如果你的字元集編碼格式為utf-8的話,那麼767/3=255個字元,只能支援到255個字元,而非767,這點需要特別注意。
解決辦法,將有unique的欄位變小,變成128 即可
本文出自 “崔德華營運打工從業路” 部落格,請務必保留此出處http://cuidehua.blog.51cto.com/5449828/1767117
flask 建表語句和常見報錯