0

SQLAlchemy Object Relational Tutorialを読んでいますが、query() 関数について少し混乱しています。

from sqlalchemy import create_engine
engine = create_engine('sqlite:///users.db', echo=True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

from sqlalchemy import Column, Integer, String
from sqlalchemy import Sequence
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))
    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password
    def __repr__(self):
       return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
Base.metadata.create_all(engine)
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()enter code here
ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)
our_user = session.query(User).filter_by(name='ed').first()
session.add_all([User('wendy', 'Wendy Williams', 'foobar'),User('mary', 'Mary Contrary', 'xxg527'),User('fred', 'Fred Flinstone', 'blah')])
session.commit()

医者は言った

セッションは、フラッシュと呼ばれるプロセスを使用して、必要に応じてすぐに Ed Jones を永続化するための SQL を発行します。データベースに Ed Jones のクエリを実行すると、保留中のすべての情報が最初にフラッシュされ、その後すぐにクエリが発行されます。

そして、私が走れば

our_user = session.query(User).filter_by(name='ed').first() 

実際に発行した

BEGIN (implicit)
INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
('ed', 'Ed Jones', 'edspassword')
SELECT users.id AS users_id,
        users.name AS users_name,
        users.fullname AS users_fullname,
        users.password AS users_password
FROM users
WHERE users.name = ?
 LIMIT ? OFFSET ?
('ed', 1, 0)

ただし、データベースは session.commit() が実行されるまで更新されませんでした (空でした)。

私の質問は次のとおりです。1.保留中のデータがフラッシュされ、INSERT INTOユーザーが表示されたのに、データベースがまだ空だったのはなぜですか? 2. データベースにはフラッシュされたデータが含まれていませんでしたが、ed_user.idを実行すると正しい主キーが返されましたか?

ありがとう

4

1 に答える 1

0

トランザクションを使用しています。データベース トランザクションは、異なる接続を分離し、データベースを一貫した状態に保つようにします。トランザクションをコミットするまで、他の接続はあなたの変更を見ることができません。

SQLAlchemy 接続は、独自のトランザクションの当事者であるため、行われたすべての変更を確認できます。

他のオプションは、トランザクションを中止し、すべての変更をロールバックすることです。新しいオブジェクトは、この接続またはその他のデータベースに存在しなくなります。

データベース トランザクションは一般的な概念であり、SQLAlchemy に固有のものではありません。

于 2013-07-01T11:19:29.297 に答える