我正在使用Flask和sqlite作为数据库。项目的要求不断增加,所以我必须添加列,但我无法做到。我在谷歌搜索但没有找到答案。 来自model.py
的代码部分class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
default = db.Column(db.Boolean, default=False, index=True)
permissions = db.Column(db.Integer)
users = db.relationship('User', backref='role', lazy='dynamic')
@staticmethod
def insert_roles():
roles = {
'User': (Permission.FOLLOW |
Permission.COMMENT |
Permission.WRITE_ARTICLES, True),
'Moderator': (Permission.FOLLOW |
Permission.COMMENT |
Permission.WRITE_ARTICLES |
Permission.MODERATE_COMMENTS, False),
'Administrator': (0xff, False)
}
for r in roles:
role = Role.query.filter_by(name=r).first()
if role is None:
role = Role(name=r)
role.permissions = roles[r][0]
role.default = roles[r][1]
db.session.add(role)
db.session.commit()
def __repr__(self):
return '<Role %r>' % self.name
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
password_hash = db.Column(db.String(128))
confirmed = db.Column(db.Boolean, default=False)
name = db.Column(db.String(64))
age = db.Column(db.Integer)
location = db.Column(db.String(64))
about_me = db.Column(db.Text())
member_since = db.Column(db.DateTime(), default=datetime.utcnow)
last_seen = db.Column(db.DateTime(), default=datetime.utcnow)
avatar_hash = db.Column(db.String(32))
posts = db.relationship('Post', backref='author', lazy='dynamic')
每当我尝试通过运行命令添加列时
python manage.py db upgrade
到它;它抛出以下错误:
sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)表 角色已存在[SQL:u&#39; \ nCREATE TABLE角色(\ n \ tid INTEGER NOT NULL,\ n \ tname VARCHAR(64),\ n \ tPRIMARY KEY(id),\ n \ tUNIQUE (名)\ n)的\ n \ n&#39;]
如何将列添加到我的数据库?
答案 0 :(得分:0)
db migrate
之后
运行python manage.py db upgrade
。
答案 1 :(得分:0)
错误消息是&#34;表格角色已经存在&#34;。因此,您需要首先删除数据库并尝试再次运行python manage.py db upgrade。
答案 2 :(得分:0)
您必须通过运行mysqli_*
;
我遇到了同样的问题,您可以尝试我的解决方案:
db.create_all()
以创建新的迁移; ... db init
和... db migrate
; ... db upgrade
和init迁移之间可能会有一些重复的操作。所以只需手动跳过创建表。
答案 3 :(得分:0)
运行以下三个命令:
flask db stamp head
flask db migrate
flask db upgrade