我有一个名为users的表,这里是它的架构:
class User(db.Model):
__tablename__ = "Users"
id = db.Column(db.Integer, unique=True, primary_key=True)
firstname = db.Column(db.String(64), unique=False, nullable=False)
lastname = db.Column(db.String(64), unique=False, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(93), unique=False, nullable=False)
phone = db.Column(db.String(10), unique=True, nullable=False)
publickey = db.Column(db.Text, unique=True, nullable=True)
isitseller = db.Column(db.Boolean, unique=False, nullable=False)
money = db.Column(db.Float, unique=False, nullable=False)
def __init__(self, firstname, lastname, email, password, phone, publickey, isitseller):
self.firstname = firstname
self.lastname = lastname
self.email = email
self.password = generate_password_hash(password)
self.phone = phone
self.publickey = publickey
self.isitseller = isitseller
self.money = 0.00
def check_password(self, password):
return check_password_hash(self.password, password)
def __repr__(self):
return '<User %r>' % self.firstname + " " + self.lastname
但是当我尝试用db.create_all()创建用户表时,它输出了我
(_mysql_exceptions.OperationalError) (1170, "BLOB/TEXT column 'publickey' used in key specification without a key length") [SQL: '
CREATE TABLE `Users` (
id INTEGER NOT NULL AUTO_INCREMENT,
firstname VARCHAR(64) NOT NULL,
lastname VARCHAR(64) NOT NULL,
email VARCHAR(120) NOT NULL,
password VARCHAR(93) NOT NULL,
phone VARCHAR(10) NOT NULL,
publickey TEXT,
isitseller BOOL NOT NULL,
money FLOAT NOT NULL,
PRIMARY KEY (id),
UNIQUE (id),
UNIQUE (email),
UNIQUE (phone),
UNIQUE (publickey),
CHECK (isitseller IN (0, 1))
)
']
据我所知,我需要使用TEXT或BLOB类型的colunm,但我该怎么办呢?或者将TEXT或BLOB用作UNIQUE的任何方式?
答案 0 :(得分:3)
你很困惑&#34; key&#34;使用&#34;主键&#34;。在MySQL中,键只是指在此上下文中的索引。
我强烈建议您使用varchar()
作为字段,而不是text
- 除非它确实非常大。
在任何情况下,MySQL都对索引键的大小有限制。并且,text
的大小不受限制。矛盾。通过要求长度来解决这个问题 - 正如documentation所解释的那样:
对于BLOB和TEXT列的索引,必须指定索引前缀 长度。对于CHAR和VARCHAR,前缀长度是可选的。见章节 8.3.4,“列索引”。
不幸的是,这也意味着您无法将text
列声明为唯一,因为这需要索引。
我不认为unique
语句中的create table
接受长度。您可以在前缀上定义唯一索引:
create unique index unq_users_ publickey on users(publickey(100));
小心最大长度。 MySQL根据 bytes 设置限制,这意味着字符编码会影响最大字符数(100是安全的)。