我只是修改了sqlite表,并通过控制台添加了一列;如何将此命令添加到Python文件或迁移文件中?

2024-03-29 09:13:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用sqlite数据库。我只是修改了名为“User”的表,通过sqlite数据库的控制台添加了一个名为“email\u confirm”的新列(整型)

我的命令是:

ALTER users ADD COLUMN email_confirmed INTEGER;

enter image description here

但是,因为我仍然没有通过models.py中的Python代码添加它,所以我无法在程序中使用变量“email_confirm”。 enter image description here

我的代码(models.py)如下。

我正在努力解决这个问题,如果我不能解决这个问题,我就不能进入另一个领域。。。如果您能告诉我应该在models.py、terminal中添加、修复或编写什么,以便我可以开始使用我的email\u变量,我将不胜感激

-Models.py

class User(db.Model, UserMixin):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    profile_image = db.Column(db.String(64), nullable=False, default='default_profile.jpg' ) #nullable means "it cannot be blank"
    email = db.Column(db.String(64), unique=True, index=True) #DON'T REALLY GET THE IDEA OF index=True
    first_name = db.Column(db.String(20))
    last_name = db.Column(db.String(20))
    middle_name = db.Column(db.String(20), default='', nullable=True)
    username = first_name+middle_name+last_name
    password_hash = db.Column(db.String(128))
    # email_confirmed = db.Column(db.Integer, server_default='1', nullable=False)
    #Should I add the codes above?


    def __init__(self,email,first_name, middle_name, last_name, password,{#email_confirmed#}):    
        self.email = email
        self.first_name = first_name
        self.middle_name = middle_name
        self.last_name = last_name
        self.password_hash = generate_password_hash(password)
        #self.email_confirmed = email_confirmed


p.s/当我在上面的代码中写下我注释掉的代码并迁移数据库时,我的终端说:“错误[root]错误:目标数据库不是最新的。”

另外,不知何故,如果我将当前迁移版本升级到下图中的版本,我将删除通过控制台添加的新列“email_confirm”

我执行的“ALTER…ADD COLUMN”命令在迁移文件中显示如下代码:

op.add_column('users', sa.Column('email_confirmed', sa.INTEGER(), nullable=True))

enter image description here

谢谢你的帮助


Tags: 代码nameself数据库truemiddledbstring
2条回答

主要问题是,Django希望控制数据库

Django通常应该如何处理:

  1. 您创建模型,Django将创建表
  2. 修改模型时
  3. 您应该创建一个迁移并应用迁移,这将反过来应用所有必需的数据库更改

更改数据库然后修改模型会带来麻烦,因为手动alter表中可能缺少一些细微的参数

有几种方法可以解决这个问题

1.)更改模型,手动更改表,并执行假迁移

  • 手动将表更改为与Django完全相同的状态
  • 应用假迁移

2.)转储旧数据、更改模型、创建新数据库并导入/复制数据。

  • 创建当前数据库的完整转储
  • 删除它(或者对于sqlite,只需重命名db文件)
  • 编辑models.py
  • 使用Django创建一个新的空数据库manage.py migrate
  • 尝试将转储还原到新创建的数据库。(如果字段名称和字段类型相同,则应能正常工作)

如果您对Django创建的迁移文件有任何问题,并且您的代码仅在一台服务器上运行,那么只需删除所有迁移文件(并删除__pycache__目录中所有相关的.pyc文件),然后从头开始重新创建初始迁移

请确切地告诉我们目前的情况

附录20200723:

如果发布当前数据库文件的确切当前架构,可能会有所帮助

你可以用它来做这个

sqlite3 databasefile.db ".schema users"

下面这些图片是为@gelonida拍摄的

我目前的迁移版本是新生活10版,如果我升级到新生活11版,它将从email_确认栏中删除。这对我的模型和“users”表的数据库都有效吗?我只是想纠正这个错误,回到我正确的地方,再做一次正确的事情。非常感谢你对我的帮助

enter image description here

enter image description here

enter image description here

相关问题 更多 >