sticky_pi_api.database package
Submodules
sticky_pi_api.database.images_table module
- class sticky_pi_api.database.images_table.Images(file, api_user_id=None)[source]
Bases:
BaseCustomisations
A simple constructor that allows initialization from kwargs.
Sets attributes on the constructed instance using the names and values in
kwargs
.Only keys that are present as attributes of the instance’s class are allowed. These could be, for example, any mapped columns or relationships.
- alt
- api_user_id
- api_version
- bat
- but
- datetime
- datetime_created
- device
- device_version
- property file_blob
- property filename
- height
- hum
- id
- lat
- lng
- lum
- md5
- temp
- property thumbnail
- property thumbnail_mini
- uid_annotations
- uid_intents
- width
sticky_pi_api.database.uid_annotations_table module
- class sticky_pi_api.database.uid_annotations_table.UIDAnnotations(info, api_user_id=None)[source]
Bases:
BaseCustomisations
A simple constructor that allows initialization from kwargs.
Sets attributes on the constructed instance using the names and values in
kwargs
.Only keys that are present as attributes of the instance’s class are allowed. These could be, for example, any mapped columns or relationships.
- algo_name
- algo_version
- api_user_id
- api_version
- datetime_created
- id
- json
- n_objects
- parent_image
- parent_image_id
sticky_pi_api.database.users_tables module
- class sticky_pi_api.database.users_tables.Users(password, api_user_id=None, **kwargs)[source]
Bases:
BaseCustomisations
A simple constructor that allows initialization from kwargs.
Sets attributes on the constructed instance using the names and values in
kwargs
.Only keys that are present as attributes of the instance’s class are allowed. These could be, for example, any mapped columns or relationships.
- api_user_id
- api_version
- can_write
- datetime_created
- email
- id
- is_admin
- password_hash
- project_permissions
- token_expiration = 86400
- username
sticky_pi_api.database.utils module
- class sticky_pi_api.database.utils.BaseCustomisations(api_user_id=None, **kwargs)[source]
Bases:
Base
A simple constructor that allows initialization from kwargs.
Sets attributes on the constructed instance using the names and values in
kwargs
.Only keys that are present as attributes of the instance’s class are allowed. These could be, for example, any mapped columns or relationships.
- api_user_id = Column(None, Integer(), table=None)
- api_version = Column(None, String(length=8), table=None, default=ColumnDefault('1.0.0'))
- datetime_created = Column(None, DateTime(), table=None, nullable=False)
- class sticky_pi_api.database.utils.DescribedColumn(col_type, description='', *args, **kwargs)[source]
Bases:
Column
Construct a new
Column
object.- Parameters
name –
The name of this column as represented in the database. This argument may be the first positional argument, or specified via keyword.
Names which contain no upper case characters will be treated as case insensitive names, and will not be quoted unless they are a reserved word. Names with any number of upper case characters will be quoted and sent exactly. Note that this behavior applies even for databases which standardize upper case names as case insensitive such as Oracle.
The name field may be omitted at construction time and applied later, at any time before the Column is associated with a
_schema.Table
. This is to support convenient usage within thedeclarative
extension.type_ –
The column’s type, indicated using an instance which subclasses
TypeEngine
. If no arguments are required for the type, the class of the type can be sent as well, e.g.:# use a type with arguments Column('data', String(50)) # use no arguments Column('level', Integer)
The
type
argument may be the second positional argument or specified by keyword.If the
type
isNone
or is omitted, it will first default to the special typeNullType
. If and when this_schema.Column
is made to refer to another column using_schema.ForeignKey
and/or_schema.ForeignKeyConstraint
, the type of the remote-referenced column will be copied to this column as well, at the moment that the foreign key is resolved against that remote_schema.Column
object.Changed in version 0.9.0: Support for propagation of type to a
_schema.Column
from its_schema.ForeignKey
object has been improved and should be more reliable and timely.*args – Additional positional arguments include various
SchemaItem
derived constructs which will be applied as options to the column. These include instances ofConstraint
,_schema.ForeignKey
,ColumnDefault
,Sequence
,Computed
Identity
. In some cases an equivalent keyword argument is available such asserver_default
,default
andunique
.autoincrement –
Set up “auto increment” semantics for an integer primary key column with no foreign key dependencies (see later in this docstring for a more specific definition). This may influence the DDL that will be emitted for this column during a table create, as well as how the column will be considered when INSERT statements are compiled and executed.
The default value is the string
"auto"
, which indicates that a single-column (i.e. non-composite) primary key that is of an INTEGER type with no other client-side or server-side default constructs indicated should receive auto increment semantics automatically. Other values includeTrue
(force this column to have auto-increment semantics for a composite primary key as well),False
(this column should never have auto-increment semantics), and the string"ignore_fk"
(special-case for foreign key columns, see below).The term “auto increment semantics” refers both to the kind of DDL that will be emitted for the column within a CREATE TABLE statement, when methods such as
MetaData.create_all()
andTable.create()
are invoked, as well as how the column will be considered when an INSERT statement is compiled and emitted to the database:DDL rendering (i.e.
MetaData.create_all()
,Table.create()
): When used on aColumn
that has no other default-generating construct associated with it (such as aSequence
orIdentity
construct), the parameter will imply that database-specific keywords such as PostgreSQLSERIAL
, MySQLAUTO_INCREMENT
, orIDENTITY
on SQL Server should also be rendered. Not every database backend has an “implied” default generator available; for example the Oracle backend always needs an explicit construct such asIdentity
to be included with aColumn
in order for the DDL rendered to include auto-generating constructs to also be produced in the database.INSERT semantics (i.e. when a
_sql.insert()
construct is compiled into a SQL string and is then executed on a database using_engine.Connection.execute()
or equivalent): A single-row INSERT statement will be known to produce a new integer primary key value automatically for this column, which will be accessible after the statement is invoked via theCursorResult.inserted_primary_key
attribute upon the_result.Result
object. This also applies towards use of the ORM when ORM-mapped objects are persisted to the database, indicating that a new integer primary key will be available to become part of the identity key for that object. This behavior takes place regardless of what DDL constructs are associated with the_schema.Column
and is independent of the “DDL Rendering” behavior discussed in the previous note above.
The parameter may be set to
True
to indicate that a column which is part of a composite (i.e. multi-column) primary key should have autoincrement semantics, though note that only one column within a primary key may have this setting. It can also be set toTrue
to indicate autoincrement semantics on a column that has a client-side or server-side default configured, however note that not all dialects can accommodate all styles of default as an “autoincrement”. It can also be set toFalse
on a single-column primary key that has a datatype of INTEGER in order to disable auto increment semantics for that column.Changed in version 1.1: The autoincrement flag now defaults to
"auto"
which indicates autoincrement semantics by default for single-column integer primary keys only; for composite (multi-column) primary keys, autoincrement is never implicitly enabled; as always,autoincrement=True
will allow for at most one of those columns to be an “autoincrement” column.autoincrement=True
may also be set on a_schema.Column
that has an explicit client-side or server-side default, subject to limitations of the backend database and dialect.The setting only has an effect for columns which are:
Integer derived (i.e. INT, SMALLINT, BIGINT).
Part of the primary key
Not referring to another column via
_schema.ForeignKey
, unless the value is specified as'ignore_fk'
:# turn on autoincrement for this column despite # the ForeignKey() Column('id', ForeignKey('other.id'), primary_key=True, autoincrement='ignore_fk')
It is typically not desirable to have “autoincrement” enabled on a column that refers to another via foreign key, as such a column is required to refer to a value that originates from elsewhere.
The setting has these effects on columns that meet the above criteria:
DDL issued for the column, if the column does not already include a default generating construct supported by the backend such as
Identity
, will include database-specific keywords intended to signify this column as an “autoincrement” column for specific backends. Behavior for primary SQLAlchemy dialects includes:AUTO INCREMENT on MySQL and MariaDB
SERIAL on PostgreSQL
IDENTITY on MS-SQL - this occurs even without the
Identity
construct as the :paramref:`.Column.autoincrement` parameter pre-dates this construct.SQLite - SQLite integer primary key columns are implicitly “auto incrementing” and no additional keywords are rendered; to render the special SQLite keyword
AUTOINCREMENT
is not included as this is unnecessary and not recommended by the database vendor. See the section SQLite Auto Incrementing Behavior for more background.Oracle - The Oracle dialect has no default “autoincrement” feature available at this time, instead the
Identity
construct is recommended to achieve this (theSequence
construct may also be used).Third-party dialects - consult those dialects’ documentation for details on their specific behaviors.
When a single-row
_sql.insert()
construct is compiled and executed, which does not set the_sql.Insert.inline()
modifier, newly generated primary key values for this column will be automatically retrieved upon statement execution using a method specific to the database driver in use:MySQL, SQLite - calling upon
cursor.lastrowid()
(see https://www.python.org/dev/peps/pep-0249/#lastrowid)PostgreSQL, SQL Server, Oracle - use RETURNING or an equivalent construct when rendering an INSERT statement, and then retrieving the newly generated primary key values after execution
PostgreSQL, Oracle for
_schema.Table
objects that set :paramref:`_schema.Table.implicit_returning` to False - for aSequence
only, theSequence
is invoked explicitly before the INSERT statement takes place so that the newly generated primary key value is available to the clientSQL Server for
_schema.Table
objects that set :paramref:`_schema.Table.implicit_returning` to False - theSELECT scope_identity()
construct is used after the INSERT statement is invoked to retrieve the newly generated primary key value.Third-party dialects - consult those dialects’ documentation for details on their specific behaviors.
For multiple-row
_sql.insert()
constructs invoked with a list of parameters (i.e. “executemany” semantics), primary-key retrieving behaviors are generally disabled, however there may be special APIs that may be used to retrieve lists of new primary key values for an “executemany”, such as the psycopg2 “fast insertmany” feature. Such features are very new and may not yet be well covered in documentation.
default –
A scalar, Python callable, or
_expression.ColumnElement
expression representing the default value for this column, which will be invoked upon insert if this column is otherwise not specified in the VALUES clause of the insert. This is a shortcut to usingColumnDefault
as a positional argument; see that class for full detail on the structure of the argument.Contrast this argument to :paramref:`_schema.Column.server_default` which creates a default generator on the database side.
See also
doc – optional String that can be used by the ORM or similar to document attributes on the Python side. This attribute does not render SQL comments; use the :paramref:`_schema.Column.comment` parameter for this purpose.
key – An optional string identifier which will identify this
Column
object on the_schema.Table
. When a key is provided, this is the only identifier referencing theColumn
within the application, including ORM attribute mapping; thename
field is used only when rendering SQL.index –
When
True
, indicates that a_schema.Index
construct will be automatically generated for this_schema.Column
, which will result in a “CREATE INDEX” statement being emitted for the_schema.Table
when the DDL create operation is invoked.Using this flag is equivalent to making use of the
_schema.Index
construct explicitly at the level of the_schema.Table
construct itself:Table( "some_table", metadata, Column("x", Integer), Index("ix_some_table_x", "x") )
To add the :paramref:`_schema.Index.unique` flag to the
_schema.Index
, set both the :paramref:`_schema.Column.unique` and :paramref:`_schema.Column.index` flags to True simultaneously, which will have the effect of rendering the “CREATE UNIQUE INDEX” DDL instruction instead of “CREATE INDEX”.The name of the index is generated using the default naming convention which for the
_schema.Index
construct is of the formix_<tablename>_<columnname>
.As this flag is intended only as a convenience for the common case of adding a single-column, default configured index to a table definition, explicit use of the
_schema.Index
construct should be preferred for most use cases, including composite indexes that encompass more than one column, indexes with SQL expressions or ordering, backend-specific index configuration options, and indexes that use a specific name.Note
the
_schema.Column.index
attribute on_schema.Column
does not indicate if this column is indexed or not, only if this flag was explicitly set here. To view indexes on a column, view the_schema.Table.indexes
collection or use_reflection.Inspector.get_indexes()
.info – Optional data dictionary which will be populated into the
SchemaItem.info
attribute of this object.nullable –
When set to
False
, will cause the “NOT NULL” phrase to be added when generating DDL for the column. WhenTrue
, will normally generate nothing (in SQL this defaults to “NULL”), except in some very specific backend-specific edge cases where “NULL” may render explicitly. Defaults toTrue
unless :paramref:`_schema.Column.primary_key` is alsoTrue
or the column specifies a_sql.Identity
, in which case it defaults toFalse
. This parameter is only used when issuing CREATE TABLE statements.Note
When the column specifies a
_sql.Identity
this parameter is in general ignored by the DDL compiler. The PostgreSQL database allows nullable identity column by setting this parameter toTrue
explicitly.onupdate –
A scalar, Python callable, or
ClauseElement
representing a default value to be applied to the column within UPDATE statements, which will be invoked upon update if this column is not present in the SET clause of the update. This is a shortcut to usingColumnDefault
as a positional argument withfor_update=True
.See also
Column INSERT/UPDATE Defaults - complete discussion of onupdate
primary_key – If
True
, marks this column as a primary key column. Multiple columns can have this flag set to specify composite primary keys. As an alternative, the primary key of a_schema.Table
can be specified via an explicitPrimaryKeyConstraint
object.server_default –
A
FetchedValue
instance, str, Unicode ortext()
construct representing the DDL DEFAULT value for the column.String types will be emitted as-is, surrounded by single quotes:
Column('x', Text, server_default="val") x TEXT DEFAULT 'val'
A
text()
expression will be rendered as-is, without quotes:Column('y', DateTime, server_default=text('NOW()')) y DATETIME DEFAULT NOW()
Strings and text() will be converted into a
DefaultClause
object upon initialization.This parameter can also accept complex combinations of contextually valid SQLAlchemy expressions or constructs:
from sqlalchemy import create_engine from sqlalchemy import Table, Column, MetaData, ARRAY, Text from sqlalchemy.dialects.postgresql import array engine = create_engine( 'postgresql://scott:tiger@localhost/mydatabase' ) metadata_obj = MetaData() tbl = Table( "foo", metadata_obj, Column("bar", ARRAY(Text), server_default=array(["biz", "bang", "bash"]) ) ) metadata_obj.create_all(engine)
The above results in a table created with the following SQL:
CREATE TABLE foo ( bar TEXT[] DEFAULT ARRAY['biz', 'bang', 'bash'] )
Use
FetchedValue
to indicate that an already-existing column will generate a default value on the database side which will be available to SQLAlchemy for post-fetch after inserts. This construct does not specify any DDL and the implementation is left to the database, such as via a trigger.See also
Server-invoked DDL-Explicit Default Expressions - complete discussion of server side defaults
server_onupdate –
A
FetchedValue
instance representing a database-side default generation function, such as a trigger. This indicates to SQLAlchemy that a newly generated value will be available after updates. This construct does not actually implement any kind of generation function within the database, which instead must be specified separately.Warning
This directive does not currently produce MySQL’s “ON UPDATE CURRENT_TIMESTAMP()” clause. See Rendering ON UPDATE CURRENT TIMESTAMP for MySQL / MariaDB’s explicit_defaults_for_timestamp for background on how to produce this clause.
quote – Force quoting of this column’s name on or off, corresponding to
True
orFalse
. When left at its default ofNone
, the column identifier will be quoted according to whether the name is case sensitive (identifiers with at least one upper case character are treated as case sensitive), or if it’s a reserved word. This flag is only needed to force quoting of a reserved word which is not known by the SQLAlchemy dialect.unique –
When
True
, and the :paramref:`_schema.Column.index` parameter is left at its default value ofFalse
, indicates that a_schema.UniqueConstraint
construct will be automatically generated for this_schema.Column
, which will result in a “UNIQUE CONSTRAINT” clause referring to this column being included in theCREATE TABLE
statement emitted, when the DDL create operation for the_schema.Table
object is invoked.When this flag is
True
while the :paramref:`_schema.Column.index` parameter is simultaneously set toTrue
, the effect instead is that a_schema.Index
construct which includes the :paramref:`_schema.Index.unique` parameter set toTrue
is generated. See the documentation for :paramref:`_schema.Column.index` for additional detail.Using this flag is equivalent to making use of the
_schema.UniqueConstraint
construct explicitly at the level of the_schema.Table
construct itself:Table( "some_table", metadata, Column("x", Integer), UniqueConstraint("x") )
The :paramref:`_schema.UniqueConstraint.name` parameter of the unique constraint object is left at its default value of
None
; in the absence of a naming convention for the enclosing_schema.MetaData
, the UNIQUE CONSTRAINT construct will be emitted as unnamed, which typically invokes a database-specific naming convention to take place.As this flag is intended only as a convenience for the common case of adding a single-column, default configured unique constraint to a table definition, explicit use of the
_schema.UniqueConstraint
construct should be preferred for most use cases, including composite constraints that encompass more than one column, backend-specific index configuration options, and constraints that use a specific name.Note
the
_schema.Column.unique
attribute on_schema.Column
does not indicate if this column has a unique constraint or not, only if this flag was explicitly set here. To view indexes and unique constraints that may involve this column, view the_schema.Table.indexes
and/or_schema.Table.constraints
collections or use_reflection.Inspector.get_indexes()
and/or_reflection.Inspector.get_unique_constraints()
system –
When
True
, indicates this is a “system” column, that is a column which is automatically made available by the database, and should not be included in the columns list for aCREATE TABLE
statement.For more elaborate scenarios where columns should be conditionally rendered differently on different backends, consider custom compilation rules for
CreateColumn
.comment –
Optional string that will render an SQL comment on table creation.
New in version 1.2: Added the :paramref:`_schema.Column.comment` parameter to
_schema.Column
.
- inherit_cache = True
Indicate if this
HasCacheKey
instance should make use of the cache key generation scheme used by its immediate superclass.The attribute defaults to
None
, which indicates that a construct has not yet taken into account whether or not its appropriate for it to participate in caching; this is functionally equivalent to setting the value toFalse
, except that a warning is also emitted.This flag can be set to
True
on a particular class, if the SQL that corresponds to the object does not change based on attributes which are local to this class, and not its superclass.See also
Enabling Caching Support for Custom Constructs - General guideslines for setting the
HasCacheKey.inherit_cache
attribute for third-party or user defined SQL constructs.