mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-14 12:47:22 -04:00
190e0139e8
This is a very useful assertion which prevents unused variables from being set up allows code to be more readable and sometimes even more efficient. test suites seem to be where the most problems are and there do not seem to be documentation examples that are using this, or at least the linter is not taking effect within rst blocks. Change-Id: I2b3341d8dd14da34879d8425838e66a4b9f8e27d
182 lines
4.7 KiB
Python
182 lines
4.7 KiB
Python
"""In this series of tests, we're looking at a method that inserts a row
|
|
within a distinct transaction, and afterwards returns to essentially a
|
|
"closed" state. This would be analogous to an API call that starts up
|
|
a database connection, inserts the row, commits and closes.
|
|
|
|
"""
|
|
from sqlalchemy import bindparam
|
|
from sqlalchemy import Column
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy import Integer
|
|
from sqlalchemy import pool
|
|
from sqlalchemy import String
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.orm import Session
|
|
from . import Profiler
|
|
|
|
|
|
Base = declarative_base()
|
|
engine = None
|
|
|
|
|
|
class Customer(Base):
|
|
__tablename__ = "customer"
|
|
id = Column(Integer, primary_key=True)
|
|
name = Column(String(255))
|
|
description = Column(String(255))
|
|
|
|
|
|
Profiler.init("single_inserts", num=10000)
|
|
|
|
|
|
@Profiler.setup
|
|
def setup_database(dburl, echo, num):
|
|
global engine
|
|
engine = create_engine(dburl, echo=echo)
|
|
if engine.dialect.name == "sqlite":
|
|
engine.pool = pool.StaticPool(creator=engine.pool._creator)
|
|
Base.metadata.drop_all(engine)
|
|
Base.metadata.create_all(engine)
|
|
|
|
|
|
@Profiler.profile
|
|
def test_orm_commit(n):
|
|
"""Individual INSERT/COMMIT pairs via the ORM"""
|
|
|
|
for i in range(n):
|
|
session = Session(bind=engine)
|
|
session.add(
|
|
Customer(
|
|
name="customer name %d" % i,
|
|
description="customer description %d" % i,
|
|
)
|
|
)
|
|
session.commit()
|
|
|
|
|
|
@Profiler.profile
|
|
def test_bulk_save(n):
|
|
"""Individual INSERT/COMMIT pairs using the "bulk" API """
|
|
|
|
for i in range(n):
|
|
session = Session(bind=engine)
|
|
session.bulk_save_objects(
|
|
[
|
|
Customer(
|
|
name="customer name %d" % i,
|
|
description="customer description %d" % i,
|
|
)
|
|
]
|
|
)
|
|
session.commit()
|
|
|
|
|
|
@Profiler.profile
|
|
def test_bulk_insert_dictionaries(n):
|
|
"""Individual INSERT/COMMIT pairs using the "bulk" API with dictionaries"""
|
|
|
|
for i in range(n):
|
|
session = Session(bind=engine)
|
|
session.bulk_insert_mappings(
|
|
Customer,
|
|
[
|
|
dict(
|
|
name="customer name %d" % i,
|
|
description="customer description %d" % i,
|
|
)
|
|
],
|
|
)
|
|
session.commit()
|
|
|
|
|
|
@Profiler.profile
|
|
def test_core(n):
|
|
"""Individual INSERT/COMMIT pairs using Core."""
|
|
|
|
for i in range(n):
|
|
with engine.begin() as conn:
|
|
conn.execute(
|
|
Customer.__table__.insert(),
|
|
dict(
|
|
name="customer name %d" % i,
|
|
description="customer description %d" % i,
|
|
),
|
|
)
|
|
|
|
|
|
@Profiler.profile
|
|
def test_core_query_caching(n):
|
|
"""Individual INSERT/COMMIT pairs using Core with query caching"""
|
|
|
|
cache = {}
|
|
ins = Customer.__table__.insert()
|
|
for i in range(n):
|
|
with engine.begin() as conn:
|
|
conn.execution_options(compiled_cache=cache).execute(
|
|
ins,
|
|
dict(
|
|
name="customer name %d" % i,
|
|
description="customer description %d" % i,
|
|
),
|
|
)
|
|
|
|
|
|
@Profiler.profile
|
|
def test_dbapi_raw_w_connect(n):
|
|
"""Individual INSERT/COMMIT pairs w/ DBAPI + connection each time"""
|
|
|
|
_test_dbapi_raw(n, True)
|
|
|
|
|
|
@Profiler.profile
|
|
def test_dbapi_raw_w_pool(n):
|
|
"""Individual INSERT/COMMIT pairs w/ DBAPI + connection pool"""
|
|
|
|
_test_dbapi_raw(n, False)
|
|
|
|
|
|
def _test_dbapi_raw(n, connect):
|
|
compiled = (
|
|
Customer.__table__.insert()
|
|
.values(name=bindparam("name"), description=bindparam("description"))
|
|
.compile(dialect=engine.dialect)
|
|
)
|
|
|
|
if compiled.positional:
|
|
args = (
|
|
("customer name %d" % i, "customer description %d" % i)
|
|
for i in range(n)
|
|
)
|
|
else:
|
|
args = (
|
|
dict(
|
|
name="customer name %d" % i,
|
|
description="customer description %d" % i,
|
|
)
|
|
for i in range(n)
|
|
)
|
|
sql = str(compiled)
|
|
|
|
if connect:
|
|
for arg in args:
|
|
# there's no connection pool, so if these were distinct
|
|
# calls, we'd be connecting each time
|
|
conn = engine.pool._creator()
|
|
cursor = conn.cursor()
|
|
cursor.execute(sql, arg)
|
|
cursor.lastrowid
|
|
conn.commit()
|
|
conn.close()
|
|
else:
|
|
for arg in args:
|
|
conn = engine.raw_connection()
|
|
cursor = conn.cursor()
|
|
cursor.execute(sql, arg)
|
|
cursor.lastrowid
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
Profiler.main()
|