2016-01-26 93 views
0

我正在關注官方教程並遇到問題:儘管我更改了一個對象,但session.dirty調用給了我一個空列表。我不確定是什麼原因造成的。難道在某些情況下session.dirty的行爲是不確定的?儘管修改對象,session.dirty爲空

下面的代碼:

from sqlalchemy import create_engine 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String 
from sqlalchemy.orm import sessionmaker 

engine = create_engine('sqlite:///:memory:', echo=True) 
Base = declarative_base() 

Session = sessionmaker(bind=engine) 
session = Session() 

class User(Base): 
    __tablename__ = 'users' 
    id  = Column(Integer, primary_key=True) 
    name  = Column(String) 
    fullname = Column(String) 
    password = Column(String) 

    def __repr__(self): 
     return "User<name={}, fullname={}, password={}>".format(self.name, self.fullname, self.password) 

# Create all tables 
Base.metadata.create_all(engine) 

ed_user = User(name='ed', fullname='Ed Jones', password='edspassword') 
session.add(ed_user) 
session.add_all([ 
    User(name='wendy', fullname='Wendy Williams', password='foobar'), 
    User(name='mary', fullname='Mary Contrary', password='xxg527'), 
    User(name='fred', fullname='Fred Flinstone', password='blah') 
]) 
ed_user.password = 'f8s7ccs' 
print(session.dirty) # Note: session.dirty without print does nothing 

和輸出:

2016-01-26 07:57:43,149 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 
2016-01-26 07:57:43,149 INFO sqlalchemy.engine.base.Engine() 
2016-01-26 07:57:43,150 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 
2016-01-26 07:57:43,150 INFO sqlalchemy.engine.base.Engine() 
2016-01-26 07:57:43,151 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users") 
2016-01-26 07:57:43,151 INFO sqlalchemy.engine.base.Engine() 
2016-01-26 07:57:43,152 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE users (
    id INTEGER NOT NULL, 
    name VARCHAR, 
    fullname VARCHAR, 
    password VARCHAR, 
    PRIMARY KEY (id) 
) 


2016-01-26 07:57:43,152 INFO sqlalchemy.engine.base.Engine() 
2016-01-26 07:57:43,152 INFO sqlalchemy.engine.base.Engine COMMIT 
IdentitySet([]) 

回答

0

好吧,我理解了它自己。我在session.dirty中沒有收到任何東西,因爲還沒有提交可以與之比較。事實上,Ed的對象在session.new中可見。所以當我做了一個session.commit(),然後改變埃德,該對象可在session.dirty