Reputation: 21243
I have table in mysql and engine is InnoDB.
System Configuration
mysql --version
mysql Ver 14.14 Distrib 5.1.58, for redhat-linux-gnu (x86_64) using readline 5.1
python --version
Python 2.7
file: test.py
from sqlalchemy import create_engine
engine = create_engine('mysql://test:test@localhost/test1', echo=True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(length=20))
fullname = Column(String(length=10))
password = Column(String(length=20))
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()
session.begin_nested()
ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)
session.commit()
After that I get on console
2011-09-20 12:03:02,067 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2011-09-20 12:03:02,067 INFO sqlalchemy.engine.base.Engine ()
2011-09-20 12:03:02,070 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'character_set%%'
2011-09-20 12:03:02,071 INFO sqlalchemy.engine.base.Engine ()
2011-09-20 12:03:02,072 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names'
2011-09-20 12:03:02,072 INFO sqlalchemy.engine.base.Engine ()
2011-09-20 12:03:02,073 INFO sqlalchemy.engine.base.Engine SHOW COLLATION
2011-09-20 12:03:02,074 INFO sqlalchemy.engine.base.Engine ()
2011-09-20 12:03:02,079 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2011-09-20 12:03:02,080 INFO sqlalchemy.engine.base.Engine ()
2011-09-20 12:03:02,081 INFO sqlalchemy.engine.base.Engine DESCRIBE `users`
2011-09-20 12:03:02,082 INFO sqlalchemy.engine.base.Engine ()
2011-09-20 12:03:02,091 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-09-20 12:03:02,092 INFO sqlalchemy.engine.base.Engine SAVEPOINT sa_savepoint_1
2011-09-20 12:03:02,092 INFO sqlalchemy.engine.base.Engine ()
2011-09-20 12:03:02,095 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (%s, %s, %s)
2011-09-20 12:03:02,095 INFO sqlalchemy.engine.base.Engine ('ed', 'Ed Jones', 'edspassword')
2011-09-20 12:03:02,120 INFO sqlalchemy.engine.base.Engine RELEASE SAVEPOINT sa_savepoint_1
2011-09-20 12:03:02,120 INFO sqlalchemy.engine.base.Engine ()
Then i check in database for entry of this and get
mysql test1 -p
mysql> use test1
Database changed
mysql> select * from users;
Empty set (0.00 sec)
Then i was wondering why no entry in DB. I check the log and i found there is SAVEPOINT sa_savepoint_1 and RELEASE SAVEPOINT sa_savepoint_1 but no commit statement. So i add one extra commit in file so last few lines are .
session.begin_nested()
ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)
session.commit()
session.commit()
Then log is chenged to
2011-09-20 12:09:16,847 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-09-20 12:09:16,847 INFO sqlalchemy.engine.base.Engine SAVEPOINT sa_savepoint_1
2011-09-20 12:09:16,848 INFO sqlalchemy.engine.base.Engine ()
2011-09-20 12:09:16,849 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (%s, %s, %s)
2011-09-20 12:09:16,850 INFO sqlalchemy.engine.base.Engine ('ed', 'Ed Jones', 'edspassword')
2011-09-20 12:09:16,871 INFO sqlalchemy.engine.base.Engine RELEASE SAVEPOINT sa_savepoint_1
2011-09-20 12:09:16,871 INFO sqlalchemy.engine.base.Engine ()
2011-09-20 12:09:16,872 INFO sqlalchemy.engine.base.Engine COMMIT
Now i get the line in database
mysql> use test1
Database changed
mysql> select * from users;
+----+------+----------+-------------+
| id | name | fullname | password |
+----+------+----------+-------------+
| 2 | ed | Ed Jones | edspassword |
+----+------+----------+-------------+
1 row in set (0.00 sec)
So is this any meaning for commit 2 times if we start savepoint ? or is this behavior of begin_nested of sqlalchemy.
Upvotes: 2
Views: 11188
Reputation: 76992
EDIT: since the answer has been accepted, I edited to make it more clear in the view of a new information as defined by comments below.
Unless you use autocommit=True
, the transaction is started automatically, and therefore you do not need to call session.begin()
explicitly.
Upvotes: 4