14

次のマッピングがあります(SAの例から直接):

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)

私はMySql DBを使用しており、テーブルにはinnoDBエンジンがあります。

テーブルには 1 つのレコードがあります: 1|'user1'|'user1 test'|'password'

次のコードでセッションを開きました。

from sqlalchemy.orm.session import sessionmaker
from sqlalchemy.engine import create_engine
from sqlalchemy.orm.scoping import scoped_session
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

db_engine = create_engine('mysql://...@localhost/test_db?charset=utf8',echo=False,pool_recycle=1800)
session_factory = sessionmaker(bind=db_engine,autocommit=False,autoflush=False)
session_maker = scoped_session(session_factory)
session = session_maker()

user_1 = session.query(User).filter(User.id==1).one()
user_1.name # This prints: u'user1'

ここで、DB 内のレコードの名前を「user1_change」に変更してコミットし、次のようにオブジェクトを更新すると:

session.refresh(user_1)
user_1.name # This still prints: u'user1' and not u'user1_change'

u'user1_change' ではなく、u'user1' と表示されます。

ここで何が欠けていますか (または設定が間違っていますか)?

ありがとう!

4

4 に答える 4

2

公式ドキュメントに記載されているように、「期限切れ」を試しましたか:

http://docs.sqlalchemy.org/en/rel_0_8/orm/session.html#refreshing-expiring

# expire objects obj1, obj2, attributes will be reloaded
# on the next access:
session.expire(user_1)
session.refresh(user_1)

オブジェクトで expire を使用すると、次のアクセス時にリロードが発生します。

于 2013-09-16T15:34:38.270 に答える
-1

セッションをマージします。

u = session.query(User).get(id)
u.name = 'user1_changed'
u = session.merge(u)

これにより、データベースが更新され、新しいオブジェクトが返されます。

于 2013-09-16T16:41:44.953 に答える