|
import datetime |
|
import sys |
|
import time |
|
from sqlalchemy import Engine, create_engine, func, text, String |
|
from sqlalchemy.orm import Session, DeclarativeBase, MappedAsDataclass, Mapped, mapped_column |
|
|
|
_TEST_TABLE = "test_table" |
|
|
|
class Base(DeclarativeBase, MappedAsDataclass): |
|
pass |
|
|
|
class TestData(Base): |
|
__tablename__ = _TEST_TABLE |
|
|
|
host: Mapped[str] = mapped_column(String[10]) |
|
status: Mapped[int] |
|
id: Mapped[int] = mapped_column(default=None, primary_key=True) |
|
time: Mapped[datetime.datetime] = mapped_column(server_default=func.now(), |
|
default_factory=datetime.datetime.now) |
|
|
|
def _delete_table(engine: Engine) -> None: |
|
with Session(engine) as session: |
|
session.execute(text(f"DROP TABLE IF EXISTS {_TEST_TABLE}")) |
|
session.commit() |
|
|
|
def _create_table(engine: Engine) -> None: |
|
Base.metadata.create_all(engine) |
|
|
|
def _add_data_to_table(engine: Engine, count: int) -> None: |
|
with Session(engine) as session: |
|
for i in range(count): |
|
tmp = TestData(host=str(i), status=i) |
|
session.add(tmp) |
|
session.commit() |
|
if not (i % 10000) and i: |
|
print(f"Completed {i} additions") |
|
|
|
if __name__ == "__main__": |
|
match sys.argv[1]: |
|
case "sqlite": |
|
engine = create_engine("sqlite:///:memory:") |
|
case "postgres": |
|
engine = create_engine("postgresql+psycopg://postgres:random@localhost/test-db") |
|
case _ : |
|
raise ValueError("""Please provide "sqlite" or "postgres" as the first argument""") |
|
|
|
_delete_table(engine) |
|
_create_table(engine) |
|
|
|
count = int(sys.argv[2]) |
|
start = time.monotonic_ns() |
|
_add_data_to_table(engine, count) |
|
stop = time.monotonic_ns() |
|
print(f"{count} additions took {(stop - start) / 1_000_000}ms") |
|
|