2013-08-22 69 views
0

我想創建一對一的關係。爲什麼輸出是None?sqlalchemy,爲什麼沒有建立關係

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 

回答

3

你給User一個(自增)整數ID(主密鑰)和從Item參考。但是,您將用戶的name(一個字符串!)傳遞給新創建的Item而不是ID。對於大多數數據庫引擎而言,這些代碼只會炸燬。但SQLite:

  1. Does not enforce默認情況下的外鍵約束。
  2. 有鬆動dynamic typing

因此它失敗了。

您應該傳遞一個實際的ID。

it1 = Item('it1', 1, ed_user.id) 

,或者給User對象本身的關係:

it1 = Item('it1', 1) 
it1.user = ed_user 

前者要求會話刷新到獲得由數據庫分配的ID值。後者「正常工作」:SQLAlchemy自動解析數據依賴關係。

相關問題