15.2.157. camcops_server.cc_modules.cc_sqlalchemy

camcops_server/cc_modules/cc_sqlalchemy.py


Copyright (C) 2012, University of Cambridge, Department of Psychiatry. Created by Rudolf Cardinal (rnc1001@cam.ac.uk).

This file is part of CamCOPS.

CamCOPS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

CamCOPS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with CamCOPS. If not, see <https://www.gnu.org/licenses/>.


SQLAlchemy helper functions and constants.

We define our metadata Base here, and things like our index naming convention and MySQL table formats.

A few random notes:

  • SQLAlchemy will automatically warn about clashing columns:

    SAWarning: On class 'Thing', Column object 'b' named directly multiple
    times, only one will be used: b, c. Consider using orm.synonym instead
    
class camcops_server.cc_modules.cc_sqlalchemy.Base(**kwargs: Any)[source]
__init__(**kwargs: Any) None

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.

class camcops_server.cc_modules.cc_sqlalchemy.MutableDict[source]

Source: https://docs.sqlalchemy.org/en/14/orm/extensions/mutable.html

classmethod coerce(key: str, value: Any) Any[source]

Convert plain dictionaries to MutableDict.

camcops_server.cc_modules.cc_sqlalchemy.assert_constraint_name_ok(table_name: str, column_name: str) None[source]

Checks that the automatically generated name of a constraint isn’t too long for specific databases.

Parameters
  • table_name – table name

  • column_name – column name

Raises

AssertionError, if something will break

camcops_server.cc_modules.cc_sqlalchemy.get_all_ddl(dialect_name: str = 'mysql') str[source]

Returns the DDL (data definition language; SQL CREATE TABLE commands) for our SQLAlchemy metadata.

Parameters

dialect_name – SQLAlchemy dialect name

camcops_server.cc_modules.cc_sqlalchemy.get_table_ddl(table: sqlalchemy.sql.schema.Table, dialect_name: str = 'mysql') str[source]

Returns the DDL (data definition language; SQL CREATE TABLE commands) for a specific table.

Parameters
  • table – Table to dump.

  • dialect_name – SQLAlchemy dialect name.

https://stackoverflow.com/questions/2128717/sqlalchemy-printing-raw-sql-from-create

camcops_server.cc_modules.cc_sqlalchemy.hack_pendulum_into_pymysql() None[source]

Hack in support for pendulum.DateTime into the pymysql database interface.

See https://pendulum.eustace.io/docs/#limitations.

camcops_server.cc_modules.cc_sqlalchemy.log_all_ddl(dialect_name: str = 'mysql') None[source]

Send the DDL for our SQLAlchemy metadata to the Python log.

Parameters

dialect_name – SQLAlchemy dialect name

camcops_server.cc_modules.cc_sqlalchemy.make_file_sqlite_engine(filename: str, echo: bool = False) sqlalchemy.engine.base.Engine[source]

Create an SQLAlchemy Engine for an on-disk SQLite database.

camcops_server.cc_modules.cc_sqlalchemy.make_memory_sqlite_engine(echo: bool = False) sqlalchemy.engine.base.Engine[source]

Create an SQLAlchemy Engine for an in-memory SQLite database.

camcops_server.cc_modules.cc_sqlalchemy.sql_from_sqlite_database(connection: sqlite3.Connection) str[source]

Returns SQL to describe an SQLite database.

Parameters

connection – connection to SQLite database via sqlite3 module

Returns

the SQL