0

我在mysql命令中得到以下错误typeerror: object() takes no parameters,这对我来说没有意义。该错误是由于下降从我的models.py username列,我不再需要sqlalchemy错误:object()在从db中删除列后没有参数错误model.py

enter image description here

下面是我的models.py文件中的用户模型定义,我要删除的用户名列,得到当我从模型

class User(db.Model): 
    __tablename__ = 'user' 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(32), index=True, unique=True) 
    firstname = db.Column(db.String(128)) 
    lastname = db.Column(db.String(128)) 
    email = db.Column(db.String(120), index=True, unique=True) 

删除它上面的错误下面是我用它来更新数据库我db_migrate.py文件。我得到这个从Miguel's database tutorial

#!flask/bin/python 
import types 
from migrate.versioning import api 
from app import db 
from config import SQLALCHEMY_DATABASE_URI 
from config import SQLALCHEMY_MIGRATE_REPO 
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 
migration = SQLALCHEMY_MIGRATE_REPO + ('/versions/%03d_migration.py' % (v+1)) 
tmp_module = types.ModuleType('old_model') 
old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 
exec(old_model, tmp_module.__dict__) 
script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata) 
open(migration, "wt").write(script) 
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 
print('New migration saved as ' + migration) 
print('Current database version: ' + str(v)) 

这是005_migration.py文件

from sqlalchemy import * 
from migrate import * 


from migrate.changeset import schema 
pre_meta = MetaData() 
post_meta = MetaData() 
user = Table('user', pre_meta, 
    Column('id', INTEGER(display_width=11), primary_key=True, nullable=False), 
    Column('username', VARCHAR(length=32)), 
    Column('email', VARCHAR(length=120)), 
    Column('password_hash', VARCHAR(length=128)), 
    Column('firstname', VARCHAR(length=128)), 
    Column('lastname', VARCHAR(length=128)), 
) 


def upgrade(migrate_engine): 
    # Upgrade operations go here. Don't create your own engine; bind 
    # migrate_engine to your metadata 
    pre_meta.bind = migrate_engine 
    post_meta.bind = migrate_engine 
    pre_meta.tables['user'].columns['username'].drop() 


def downgrade(migrate_engine): 
    # Operations to reverse the above upgrade go here. 
    pre_meta.bind = migrate_engine 
    post_meta.bind = migrate_engine 
    pre_meta.tables['user'].columns['username'].create() 
+1

我认为这是最好让'alembic'模块为你处理数据库迁移。你尝试过吗? –

+0

另外,我认为列的数据类型的形式是('Integer','String' ...)... –

+0

未来,请不要将回溯作为图像嵌入。 –

回答

1

我认为你正在使用的列定义了错误的数据类型,这里是正确的:

from sqlalchemy import (MetaData, Table, Column, Integer, String) 

user = Table('user', pre_meta, 
    Column('id', Integer, primary_key=True, nullable=False), 
    Column('username', String(32)), 
    Column('email', String(120)), 
    Column('firstname', String(128)), 
    Column('lastname', String(128)), 
) 

有关SQLAlchemy的列和数据类型的更多信息,请查看本link

+0

,但005_migration.py中的代码由sqlalchemy-migrate生成。在我的models.py中,我将其定义为SQLAlchemy.Integer 'id = db.Column(db.Integer,primary_key = True)' – GucciProgrammer

+0

@GucciProgrammer。迁移脚本在我的理解中仍然是实验性的,尝试手动修复这些数据类型,你应该准备好迁移..而且就像我向你建议的那样......'Alembic'好得多...... –

+0

我会试试Alembic。谢谢! :) – GucciProgrammer

0

的错误不是由于删除列,它从线始于

Column('id', INTEGER(display_width=11), primary_key=True, nullable=False), 

其中追溯清楚地表明。

INTEGER,您用from sqlalchemy import *导入的文件不带任何参数,如display_width。您应该使用方言特定数据类型sqlalchemy.dialects.mysql.INTEGER

+0

,但005_migration.py中的代码由sqlalchemy-migrate生成。在我的models.py中,我将它定义为SQLAlchemy.Integer 'id = db.Column(db.Integer,primary_key = True)'。另外,当我保留行'username = db.Column(db.String(32),index = True,unique = True)时,它迁移得很好' – GucciProgrammer

+0

然后它生成不正确,可能是通过直接读取数据库中的表定义,但使用错误的类型可以看出。该工具已损坏。我还建议给[alembic](http://alembic.zzzcomputing.com/en/latest/)一个去。如果您“保持线路”,生成的迁移是什么样的?我猜它是空的,因为没有改变迁移。 –