0

typeerror: object() takes no parametersmysql コマンドで意味をなさない次のエラーが表示されます。エラーは、不要になった models.py からユーザー名列を削除したことが原因です。

ここに画像の説明を入力

以下は、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 の更新に使用した db_migrate.py ファイルです。これは Miguel のデータベース チュートリアルから入手しました

#!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()
4

2 に答える 2

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 の列とデータ型の詳細については、このリンクを確認してください

于 2016-07-06T21:20:12.367 に答える
0

エラーは列の削除によるものではなく、行から発生しています

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

トレースバックが明確に示しています。

INTEGERでインポートすると、 display_widthfrom sqlalchemy import *などの引数はありません。方言固有のデータ型を使用する必要があります。sqlalchemy.dialects.mysql.INTEGER

于 2016-07-06T21:19:53.580 に答える