Flask-SQLAlchemy-model не имеет атрибута "внешние ключи"
у меня есть 3 модели, созданные с помощью Flask-SQLalchemy: User, Role, UserRole
user.py:
class Role( ActiveRecord, db.Model ):
__tablename__ = "roles"
# Schema
id = db.Column( db.Integer, primary_key = True )
name = db.Column( db.String( 24 ), unique = True )
description = db.Column( db.String( 90 ) )
users = db.relationship( "User", secondary = "UserRole",
backref = db.backref( "roles" ) )
role.py:
class User( db.Model, ActiveRecord ):
__tablename__ = "users"
# Schema
id = db.Column( db.Integer, primary_key = True )
email = db.Column( db.String( 90 ), unique = True )
password = db.Column( db.String( 64 ) )
# Relations
roles = db.relationship( "Role", secondary = "UserRole",
backref = db.backref( "users" ) )
user_role.py:
class UserRole( ActiveRecord, db.Model ):
__tablename__ = "user_roles"
# Schema
user_id = db.Column( db.Integer, db.ForeignKey( 'users.id' ), primary_key = True )
role_id = db.Column( db.Integer, db.ForeignKey( 'roles.id' ), primary_key = True )
если я попытаюсь (в консоли) получить всех пользователей через User.query.all()
Я AttributeError: 'NoneType' object has no attribute 'all'
и если я попробую еще раз, я получу еще одну ошибку, сказав:
sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: type object 'UserRole' has no attribute 'foreign_keys'
может кто-нибудь пролить свет на то, что именно я делаю неправильно? Я думаю, что этот код работал нормально несколько месяцев назад, но я обновил SQLAlchemy, колба и колба-SQLAlchemy недавно и это прекратилось. Это просто побочный проект.
1 ответов
здесь немного сложно, потому что вы используете некоторые неизвестные базовые классы, такие как "ActiveRecord" и такие. Тем не менее, похоже, что "вторичный" аргумент неверен:
class User( db.Model, ActiveRecord ):
__tablename__ = "users"
# Schema
id = db.Column( db.Integer, primary_key = True )
email = db.Column( db.String( 90 ), unique = True )
password = db.Column( db.String( 64 ) )
# Relations
roles = db.relationship( "Role", secondary = "UserRole", \
backref = db.backref( "users" ) )
secondary
необходимо ссылаться на Table
объект, а не сопоставленный класс, если по имени строки, то это будет "user_roles"
:
roles = db.relationship( "Role", secondary = "user_roles", \
backref = db.backref( "users" ) )