我想创建一对一的关系。为什么输出是None?
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, Float
from sqlalchemy import Sequence
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, relationship, backref
engine = create_engine('sqlite:///:memory:')#, echo=True)
Session = sessionmaker(bind=engine)
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
name = Column(String(50))
def __init__(self, name):
self.name = name
class Item(Base):
__tablename__ = 'item'
id = Column(String, primary_key=True)
value = Column(Float, default=0)
user_id = Column(Integer, ForeignKey(User.id))
user = relationship("User", backref=backref('itemA', uselist=False))
def __init__(self, id, value, user_id = None):
self.id = id
self.value = value
self.user_id = user_id
session = Session()
Base.metadata.create_all(engine)
ed_user = User('ed')
session.add(ed_user)
session.flush()
it1 = Item('it1', 1, user_id='ed')
session.add(it1)
session.flush()
print it1.user
print ed_user.itemA
答案 0 :(得分:3)
您为User
提供(自动递增)整数ID(主键)并从Item
引用它。但是然后你将用户的name
(一个字符串!)传递给新创建的Item
而不是ID。对于大多数数据库引擎,此代码只会爆炸。但是SQLite:
所以它无声地失败。
您应该传递实际ID。
it1 = Item('it1', 1, ed_user.id)
或者将User
对象本身分配给关系:
it1 = Item('it1', 1)
it1.user = ed_user
前者要求刷新会话以获取数据库分配的ID值。后者“正常工作”:SQLAlchemy自动解析数据依赖关系。