我正在阅读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()
医生说
会话将使用称为刷新的过程发出SQL以便在需要时立即保留Ed Jones。如果我们查询数据库 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 ,它会返回正确的主键吗?
由于
答案 0 :(得分:0)
您正在使用交易。数据库事务隔离不同的连接,并确保使数据库保持一致状态。在您提交事务之前,其他连接可以看到您的更改。
您的SQLAlchemy连接可以看到它所做的所有更改,因为它是自己事务的一方。
请注意,另一个选项是中止事务,并回滚所有更改,数据库,此连接或任何其他对象中将不再存在新对象。
Database transactions是一般概念,并非特定于SQLAlchemy。