尝试将Widget
添加到(SQLite)数据库时,并将其与已存在的User
关联,如下所示:
class Widget(Base):
__tablename__ = 'widgets'
id = Column(Integer, primary_key=True)
kind = Column(Text)
user = Column(Text, ForeignKey('users.name'))
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(Text, unique=True)
@view_config(route_name='name', renderer='json')
def add_widget(request):
user_name = 'foo'
user = request.dbsession.query(User).filter_by(name=user_name).one()
new_widget = Widget(kind='bar', user=user)
我收到错误sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 1 - probably unsupported type. [SQL: 'INSERT INTO widgets (kind, user) VALUES (?, ?)'] [parameters: ('bar', <example.models.user.User object at 0x1050bdghd>)]
我可以直接添加user.name
的值,但这会破坏关系。例如,widget.user.name
会出现类似'str' object has no attribute 'repository'
答案 0 :(得分:0)
backref
属性可以满足您的需求。按如下方式向用户类添加关系:
class User(Base):
...
widget = sqlalchemy.orm.relationship('Widget', backref='user')
使用backref属性,sqlalchemy将添加对Widget类的引用,该引用将指向User对象:
user = request.dbsession.query(User).filter_by(name=user_name).one()
new_widget = Widget(kind='bar', user=user)
答案 1 :(得分:0)
您的Widget
类的user
属性类型为Text
,它基本上是Python方面的字符串属性,类似于数据库中的VARCHAR列。您不能将User对象分配给期望为字符串的属性。
您似乎也尝试使用users.name
列创建外键关系 - 这当然是可能的,但考虑到您的{{1}上还有一个代理主键,这种情况很不寻常。 } model。
您需要在两个ORM类之间设置relationship:
User
然后您就可以执行以下任何操作:
class Widget(Base):
__tablename__ = 'widgets'
id = Column(Integer, primary_key=True)
kind = Column(Text)
user_id = Column(Integer, ForeignKey('users.id'))
user = sqlalchemy.orm.relationship('User', backref='widgets')
你也可以像@metmirr建议的那样设置另一端的东西,但这里的神奇成分是sqlalchemy.orm.relationship,而不是你可能选择或不选择的backref。