LSST Applications g0603fd7c41+501e3db9f9,g0aad566f14+23d8574c86,g0dd44d6229+a1a4c8b791,g2079a07aa2+86d27d4dc4,g2305ad1205+a62672bbc1,g2bbee38e9b+047b288a59,g337abbeb29+047b288a59,g33d1c0ed96+047b288a59,g3a166c0a6a+047b288a59,g3d1719c13e+23d8574c86,g487adcacf7+cb7fd919b2,g4be5004598+23d8574c86,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+4a9e435310,g63cd9335cc+585e252eca,g858d7b2824+23d8574c86,g88963caddf+0cb8e002cc,g99cad8db69+43388bcaec,g9ddcbc5298+9a081db1e4,ga1e77700b3+a912195c07,gae0086650b+585e252eca,gb0e22166c9+60f28cb32d,gb2522980b2+793639e996,gb3a676b8dc+b4feba26a1,gb4b16eec92+63f8520565,gba4ed39666+c2a2e4ac27,gbb8dafda3b+a5d255a82e,gc120e1dc64+d820f8acdb,gc28159a63d+047b288a59,gc3e9b769f7+f4f1cc6b50,gcf0d15dbbd+a1a4c8b791,gdaeeff99f8+f9a426f77a,gdb0af172c8+b6d5496702,ge79ae78c31+047b288a59,w.2024.19
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Protected Attributes | List of all members
lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql Class Reference
Inheritance diagram for lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql:
lsst.dax.apdb.apdbMetadata.ApdbMetadata

Public Member Functions

 __init__ (self, sqlalchemy.engine.Engine engine, sqlalchemy.schema.Table|None table)
 
str|None get (self, str key, str|None default=None)
 
None set (self, str key, str value, *bool force=False)
 
bool delete (self, str key)
 
Generator[tuple[str, str], None, None] items (self)
 
bool empty (self)
 
bool table_exists (self)
 

Protected Attributes

 _engine
 
 _table
 

Detailed Description

Implementation of `ApdbMetadata` for SQL backend.

Parameters
----------
engine : `sqlalchemy.engine.Engine`
    Database access engine.
table : `sqlalchemy.schema.Table` or `None`
    Database table holding metadata. If table does not exists then `None`
    should be specified.

Definition at line 33 of file apdbMetadataSql.py.

Constructor & Destructor Documentation

◆ __init__()

lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql.__init__ ( self,
sqlalchemy.engine.Engine engine,
sqlalchemy.schema.Table | None table )

Definition at line 45 of file apdbMetadataSql.py.

45 def __init__(self, engine: sqlalchemy.engine.Engine, table: sqlalchemy.schema.Table | None):
46 self._engine = engine
47 self._table = table
48

Member Function Documentation

◆ delete()

bool lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql.delete ( self,
str key )
Delete metadata record.

Parameters
----------
key : `str`
    Metadata key, arbitrary non-empty string.

Returns
-------
existed : `bool`
    `True` is returned if attribute existed before it was deleted.

Reimplemented from lsst.dax.apdb.apdbMetadata.ApdbMetadata.

Definition at line 83 of file apdbMetadataSql.py.

83 def delete(self, key: str) -> bool:
84 # Docstring is inherited.
85 if self._table is None:
86 # Missing table means nothing to delete.
87 return False
88 stmt = sqlalchemy.sql.delete(self._table).where(self._table.columns.name == key)
89 with self._engine.begin() as conn:
90 result = conn.execute(stmt)
91 return result.rowcount > 0
92

◆ empty()

bool lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql.empty ( self)
Check whether attributes set is empty.

Returns
-------
empty : `bool`
    `True` if there are no any attributes defined. `True` is also
    returned if metadata table is missing.

Reimplemented from lsst.dax.apdb.apdbMetadata.ApdbMetadata.

Definition at line 104 of file apdbMetadataSql.py.

104 def empty(self) -> bool:
105 # Docstring is inherited.
106 if self._table is None:
107 # Missing table means empty.
108 return True
109 stmt = sqlalchemy.sql.select(sqlalchemy.sql.func.count()).select_from(self._table)
110 with self._engine.begin() as conn:
111 result = conn.execute(stmt)
112 count = result.scalar()
113 return count == 0
114

◆ get()

str | None lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql.get ( self,
str key,
str | None default = None )
Retrieve value of a given metadata record.

Parameters
----------
key : `str`
    Metadata key, arbitrary non-empty string.
default : `str`, optional
    Default value returned when key does not exist, can be string
    or `None`.

Returns
-------
value : `str` or `None`
    Metadata value, if key does not exist then ``default`` is returned.

Reimplemented from lsst.dax.apdb.apdbMetadata.ApdbMetadata.

Definition at line 49 of file apdbMetadataSql.py.

49 def get(self, key: str, default: str | None = None) -> str | None:
50 # Docstring is inherited.
51 if self._table is None:
52 return default
53 sql = sqlalchemy.sql.select(self._table.columns.value).where(self._table.columns.name == key)
54 with self._engine.begin() as conn:
55 result = conn.execute(sql)
56 value = result.scalar()
57 if value is not None:
58 return value
59 return default
60

◆ items()

Generator[tuple[str, str], None, None] lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql.items ( self)
Iterate over records and yield their keys and values.

Yields
------
key : `str`
    Metadata key.
value : `str`
    Corresponding metadata value.

Reimplemented from lsst.dax.apdb.apdbMetadata.ApdbMetadata.

Definition at line 93 of file apdbMetadataSql.py.

93 def items(self) -> Generator[tuple[str, str], None, None]:
94 # Docstring is inherited.
95 if self._table is None:
96 # Missing table means nothing to return.
97 return
98 stmt = sqlalchemy.sql.select(self._table.columns.name, self._table.columns.value)
99 with self._engine.begin() as conn:
100 result = conn.execute(stmt)
101 for row in result:
102 yield row._tuple()
103
std::vector< SchemaItem< Flag > > * items

◆ set()

None lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql.set ( self,
str key,
str value,
*bool force = False )
Set value for a given metadata record.

Parameters
----------
key : `str`
    Metadata key, arbitrary non-empty string.
value : `str`
    New metadata value, an arbitrary string. Due to deficiencies of
    some database engines we are not allowing empty strings to be
    stored in the database, and ``value`` cannot be an empty string.
force : `bool`, optional
    Controls handling of existing metadata. With default `False`
    value an exception is raised if ``key`` already exists, if `True`
    is passed then value of the existing key will be updated.

Raises
------
KeyError
    Raised if key already exists but ``force`` option is false.
ValueError
    Raised if key or value parameters are empty.

Reimplemented from lsst.dax.apdb.apdbMetadata.ApdbMetadata.

Definition at line 61 of file apdbMetadataSql.py.

61 def set(self, key: str, value: str, *, force: bool = False) -> None:
62 # Docstring is inherited.
63 if self._table is None:
64 raise RuntimeError("Metadata table does not exist")
65 if not key or not value:
66 raise ValueError("name and value cannot be empty")
67 try:
68 insert = sqlalchemy.sql.insert(self._table).values(name=key, value=value)
69 with self._engine.begin() as conn:
70 conn.execute(insert)
71 except sqlalchemy.exc.IntegrityError as exc:
72 # Try to update if it exists.
73 if not force:
74 raise KeyError(f"Metadata key {key!r} already exists") from exc
75 update = (
76 sqlalchemy.sql.update(self._table).where(self._table.columns.name == key).values(value=value)
77 )
78 with self._engine.begin() as conn:
79 result = conn.execute(update)
80 if result.rowcount != 1:
81 raise RuntimeError(f"Metadata update failed unexpectedly, count={result.rowcount}")
82
daf::base::PropertySet * set
Definition fits.cc:931

◆ table_exists()

bool lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql.table_exists ( self)
Return `True` if metadata table exists.

Definition at line 115 of file apdbMetadataSql.py.

115 def table_exists(self) -> bool:
116 """Return `True` if metadata table exists."""
117 return self._table is not None

Member Data Documentation

◆ _engine

lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql._engine
protected

Definition at line 46 of file apdbMetadataSql.py.

◆ _table

lsst.dax.apdb.sql.apdbMetadataSql.ApdbMetadataSql._table
protected

Definition at line 47 of file apdbMetadataSql.py.


The documentation for this class was generated from the following file: