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/)一個去。如果您「保持線路」,生成的遷移是什麼樣的?我猜它是空的,因爲沒有改變遷移。 –