【问题标题】:Error adding columns to SQLITE向 SQLITE 添加列时出错
【发布时间】:2015-08-23 05:12:59
【问题描述】:

我正在使用 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'\nCREATE TABLE 角色 (\n\tid INTEGER NOT NULL,\n\tname VARCHAR(64),\n\tPRIMARY KEY (id),\n\tUNIQUE (姓名)\n)\n\n']

如何将列添加到我的数据库中?

【问题讨论】:

  • 在尝试升级之前您是否进行过python manage.py db migrate
  • @PattrickAllen 是的,这也给出了错误“alembic.util.CommandError:目标数据库不是最新的”

标签: python sqlite flask flask-sqlalchemy


【解决方案1】:

db migrate之后

运行python manage.py db upgrade

【讨论】:

  • 有人建议在 cmets 和 OP 中表示不起作用(另外,您拼写错误 upgrade)
  • 对不起,我只看到这个alembic.util.CommandError: Target database is not up to date
【解决方案2】:

错误消息是“表角色已存在”。因此,您需要先删除您的数据库并尝试再次运行 python manage.py db upgrade。

【讨论】:

    【解决方案3】:

    你必须已经通过运行db.create_all()创建了数据库;

    我遇到了同样的问题,你可以试试我的解决方法:

    1. 删除数据库文件(.sqlite);
    2. 删除迁移文件夹;
    3. 运行 ... db init 以创建新的迁移;
    4. 运行... db migrate... db upgrade

    db.create_all() 和 init 迁移之间可能存在一些重复操作。因此,只需跳过手动创建表即可。

    【讨论】:

      【解决方案4】:

      运行以下三个命令:

      flask db stamp head
      flask db migrate
      flask db upgrade
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        • 2015-08-22
        • 1970-01-01
        • 2016-05-31
        相关资源
        最近更新 更多