0

Ich bekomme den folgenden Fehler typeerror: object() takes no parameters auf einem MySQL-Befehl, der für mich keinen Sinn macht. Der Fehler wird durch den Benutzernamen Spalte von meinem models.py fallen, die ich nicht mehrsqlalchemy error: object() nimmt keine Parameter Fehler nach dem Löschen der Spalte aus db model.py

enter image description here

Unten ist die Benutzermodell Definition in meiner models.py Datei benötigen, möchte ich den Benutzernamen Spalte fallen zu lassen und erhalten die oben genannten Fehler, wenn ich es aus dem Modell entfernen

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) 

Unten ist meine db_migrate.py-Datei, die ich die db aktualisieren verwendet. Ich habe diese von 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)) 

Dies ist die Datei 005_migration.py ist

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

Ich denke, es ist besser zu lassen 'Alembic' Modul für Sie die db Migrationen behandeln. Hast du das versucht? –

+0

Plus, ich denke Datentypen für Spalten hat die Form ('Integer',' String' ...) ... –

+0

In Zukunft, bitte nicht Tracebacks als Bilder einbetten. –

Antwort

1

Ich glaube, Sie sind die falschen Datentypen für Spaltendefinition verwenden, sind hier die richtigen sind:

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)), 
) 

Weitere Details zu SQLAlchemy Spalte und Datentypen, aktivieren Sie dieses link

+0

aber der Code in 005_migration.py wird von sqlalchemy-migrate generiert. In meinem models.py habe ich es als SQLAlchemy.Integer definiert 'id = db.Column (db.Integer, primary_key = True)' – GucciProgrammer

+0

@GucciProgrammer .. Das Migrationsskript ist immer noch experimentell in meinem Verständnis, versuchen Sie, diese manuell zu beheben Datentypen und Sie sollten bereit sein zu migrieren .. Und wie ich Ihnen vorgeschlagen habe ... 'Alembic' ist viel besser ... –

+0

Ich werde Alembic ausprobieren. Vielen Dank! :) – GucciProgrammer

0

Der Fehler Entfernen einer Spalte nicht fällig ist, stammt sie aus der Linie

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

die der traceback zeigt deutlich an.

INTEGER, die Sie mit from sqlalchemy import * importieren keine Argumente, wie display_width. Sie sollten den dialektspezifischen Datentyp sqlalchemy.dialects.mysql.INTEGER verwenden.

+0

aber der Code in 005_migration.py wird von sqlalchemy-migrate generiert. In meiner models.py habe ich es definiert als SQLAlchemy.Integer 'id = db.Column (db.Integer, primary_key = True)'. Es migriert auch gut, wenn ich die Zeile 'username = db.Column (db.String (32), Index = True, unique = True)' – GucciProgrammer

+0

Dann wird es falsch generiert, wahrscheinlich durch direktes Lesen der Tabellendefinition aus Ihrer Datenbank , aber die falschen Typen verwenden, wie zu sehen ist. Das Werkzeug ist kaputt. Ich empfehle auch [alambic] (http://alembic.zzzcomputing.com/en/latest/) zu gehen. Wie sieht die generierte Migration aus, wenn Sie "die Linie halten"? Ich denke, es ist leer, da es keine Änderungen zu migrieren gibt. –