flask 建表語句和常見報錯

$ cat models/user.py
#!/usr/bin/env python
# encoding: utf-8
__author__ = 'Andy'
from extensions import db
from datetime import datetime
class 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())


執行建表python

sudo python manage.py db_setupmysql

報錯sql


sqlalchemy.exc.InternalError: (InternalError) (1071, u'Specified key was too long; max key length is 767 bytes')ide



緣由:編碼

將字段設置成爲unique後mysql會自動將惟一性索引創建在該字段上,,而對於維護惟一性索引又會存在着系統開銷,因此就會出現這種問題,一方面提供惟一性索引,另外避免維護過長的索引形成的開銷問題。spa

另外在mysql中還有一個問題必須注意,那就是utf-8默認是一個字符佔用三個字節,對於GBK這些編碼方式佔用的是2個字節,所以若是你的字符集編碼格式爲utf-8的話,那麼767/3=255個字符,只能支持到255個字符,而非767,這點須要特別注意。orm


解決辦法,將有unique的字段變小,變成128 便可sqlalchemy

相關文章
相關標籤/搜索