class DispLevel(Tuple, DeclarativeBase): __tablename__ = 'DispLevel' __tupleTypeShort__ = 'DLE' __tupleType__ = diagramTuplePrefix + __tablename__ #: Misc data holder data = TupleField() id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50), nullable=False) order = Column(Integer, nullable=False, server_default='0') minZoom = Column(Float) maxZoom = Column(Float) coordSetId = Column(Integer, ForeignKey('ModelCoordSet.id', ondelete='CASCADE'), nullable=False) coordSet = relationship(ModelCoordSet, foreign_keys=[coordSetId]) importHash = Column(String(100), doc=JSON_EXCLUDE) __table_args__ = ( Index("idx_DispLevel_coordSetId", coordSetId, unique=False), Index("idx_DispLevel_importHash", coordSetId, importHash, unique=True), )
class DispLayer(Tuple, DeclarativeBase): __tablename__ = 'DispLayer' __tupleTypeShort__ = 'DLA' __tupleType__ = diagramTuplePrefix + __tablename__ #: Misc data holder data = TupleField() id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50), nullable=False) order = Column(Integer, nullable=False, server_default='0') selectable = Column(Boolean, nullable=False, server_default='false') visible = Column(Boolean, nullable=False, server_default='true') modelSetId = Column(Integer, ForeignKey('ModelSet.id', ondelete='CASCADE'), nullable=False) modelSet = relationship(ModelSet) importHash = Column(String(100), doc=JSON_EXCLUDE) __table_args__: typing.Tuple = ( Index("idx_DispLayer_modelSetId", modelSetId, unique=False), Index("idx_DispLayer_importHash", modelSetId, importHash, unique=True), )
class DispTextStyle(Tuple, DeclarativeBase): __tupleTypeShort__ = 'DTS' __tablename__ = 'DispTextStyle' __tupleType__ = diagramTuplePrefix + __tablename__ #: Misc data holder data = TupleField() id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50), nullable=False) fontName = Column(String(30), nullable=False, server_default="GillSans") fontSize = Column(Integer, nullable=False, server_default='9') fontStyle = Column(String(30)) scalable = Column(Boolean, nullable=False, server_default="true") scaleFactor = Column(Integer, nullable=False, server_default="1") modelSetId = Column(Integer, ForeignKey('ModelSet.id', ondelete='CASCADE'), doc=JSON_EXCLUDE, nullable=False) modelSet = relationship(ModelSet) importHash = Column(String(100), doc=JSON_EXCLUDE) __table_args__ = ( Index("idx_DispTextStyle_modelSetId", modelSetId, unique=False), Index("idx_DispTextStyle_importHash", modelSetId, importHash, unique=True), )
class DispColor(Tuple, DeclarativeBase): __tupleTypeShort__ = 'DC' __tablename__ = 'DispColor' __tupleType__ = diagramTuplePrefix + __tablename__ #: Misc data holder data = TupleField() id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50), doc=JSON_EXCLUDE, nullable=False) color = Column(String(20), server_default='orange') altColor = Column(String(20)) swapPeriod = Column(Float) modelSetId = Column(Integer, ForeignKey('ModelSet.id', ondelete='CASCADE'), doc=JSON_EXCLUDE, nullable=False) modelSet = relationship(ModelSet) importHash = Column(String(100), doc=JSON_EXCLUDE) __table_args__ = ( Index("idx_DispColor_modelSetId", modelSetId, unique=False), Index("idx_DispColor_importHash", modelSetId, importHash, unique=True), )
class TimestampSequencedWithIDRecord(Base): __tablename__ = "timestamp_sequenced_items" # Record ID. id = Column( BigInteger().with_variant(Integer, "sqlite"), primary_key=True, index=True, unique=True, autoincrement=True, ) # Sequence ID (e.g. an entity or aggregate ID). sequence_id = Column(UUIDType(), nullable=False) # Position (timestamp) of item in sequence. position = Column(DECIMAL(24, 6, 6), nullable=False, unique=False) # Topic of the item (e.g. path to domain event class). topic = Column(Text(), nullable=False) # State of the item (serialized dict, possibly encrypted). state = Column(LargeBinary()) __table_args__ = ( Index( "timestamp_sequenced_items_sequence_id_position_index", "sequence_id", "position", unique=True, ), Index("timestamp_sequenced_items_position_index", "position", unique=False), )
class SearchObject(Tuple, DeclarativeBase): __tablename__ = 'SearchObject' __tupleType__ = searchTuplePrefix + 'SearchObjectTable' id = Column(BigInteger, primary_key=True, autoincrement=True) #: The object that this routs is for objectTypeId = Column(Integer, ForeignKey('SearchObjectType.id', ondelete='CASCADE'), nullable=False) key = Column(String, nullable=False) chunkKey = Column(Integer, nullable=False) fullKwPropertiesJson = Column(String, nullable=True) partialKwPropertiesJson = Column(String, nullable=True) packedJson = Column(String, nullable=True) __table_args__ = ( Index("idx_SearchObject_objectTypeId", objectTypeId), Index("idx_SearchObject_key", key, unique=True), Index("idx_SearchObject_chunkKey", chunkKey), )
class DispLineStyle(Tuple, DeclarativeBase): __tupleTypeShort__ = 'DLS' __tablename__ = 'DispLineStyle' __tupleType__ = diagramTuplePrefix + __tablename__ #: Misc data holder data = TupleField() id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50), nullable=False) backgroundFillDashSpace = Column(Boolean, nullable=False, server_default='false') capStyle = Column(String(15), nullable=False) joinStyle = Column(String(15), nullable=False) dashPattern = Column(String(50)) startArrowSize = Column(Integer) endArrowSize = Column(Integer) winStyle = Column(Integer, nullable=False) modelSetId = Column(Integer, ForeignKey('ModelSet.id', ondelete='CASCADE'), doc=JSON_EXCLUDE, nullable=False) modelSet = relationship(ModelSet) importHash = Column(String(100), doc=JSON_EXCLUDE) __table_args__ = ( Index("idx_DispLineStyle_modelSetId", modelSetId, unique=False), Index("idx_DispLineStyle_importHash", modelSetId, importHash, unique=True), )
class SearchObjectRoute(Tuple, DeclarativeBase): """ Search Object Route This is like the "Open with" """ __tablename__ = 'SearchObjectRoute' __tupleType__ = searchTuplePrefix + 'SearchObjectRouteTable' id = Column(Integer, primary_key=True, autoincrement=True) #: The object that this routs is for objectId = Column(Integer, ForeignKey('SearchObject.id', ondelete='CASCADE'), nullable=False) importGroupHash = Column(String, nullable=False) routeTitle = Column(String, nullable=False) routePath = Column(String, nullable=False) __table_args__ = ( Index("idx_ObjectRoute_objectId", objectId), # For foreign key Index("idx_ObjectRoute_routeTitle_importGroupHash", importGroupHash, unique=False), Index("idx_ObjectRoute_routeTitle_objectId", routeTitle, objectId, unique=True), )
class LocationIndexCompiled(Tuple, DeclarativeBase, ACIEncodedChunkTupleABC): __tablename__ = 'LocationIndexCompiled' __tupleType__ = diagramTuplePrefix + __tablename__ id = Column(BigInteger, primary_key=True, autoincrement=True) indexBucket = Column(String(100), primary_key=True) blobData = Column(PeekLargeBinary, nullable=False) lastUpdate = Column(String(50), nullable=False) modelSetId = Column(Integer, ForeignKey('ModelSet.id', ondelete='CASCADE'), nullable=False) modelSet = relationship(ModelSet) __table_args__ = ( Index("idx_LIIndexUpdate_modelSetId", modelSetId, unique=False), Index("idx_LIIndexUpdate_indexBucket", indexBucket, unique=True), ) @property def ckiChunkKey(self): return self.indexBucket @property def ckiHasEncodedData(self) -> bool: return bool(self.blobData) @property def ckiLastUpdate(self): return self.lastUpdate @classmethod def ckiCreateDeleteEncodedChunk(cls, chunkKey: str): from peek_plugin_diagram._private.tuples.location_index.EncodedLocationIndexTuple import \ EncodedLocationIndexTuple return EncodedLocationIndexTuple(indexBucket=chunkKey) @classmethod def sqlCoreChunkKeyColumn(cls): return cls.__table__.c.indexBucket @classmethod def sqlCoreLoad(cls, row): from peek_plugin_diagram._private.tuples.location_index.EncodedLocationIndexTuple import \ EncodedLocationIndexTuple return EncodedLocationIndexTuple(modelSetKey=row.key, indexBucket=row.indexBucket, encodedLocationIndexTuple=row.blobData, lastUpdate=row.lastUpdate)
class GridKeyIndexCompiled(Tuple, DeclarativeBase, ACIEncodedChunkTupleABC): __tablename__ = 'GridKeyIndexCompiled' __tupleType__ = diagramTuplePrefix + __tablename__ id = Column(BigInteger, primary_key=True, autoincrement=True) gridKey = Column(String(30), nullable=False) encodedGridTuple = Column(PeekLargeBinary, nullable=False) lastUpdate = Column(String(50), nullable=False) coordSetId = Column(Integer, ForeignKey('ModelCoordSet.id', ondelete='CASCADE'), nullable=False) coordSet = relationship(ModelCoordSet) __table_args__ = ( Index("idx_GKIndexUpdate_coordSetId", coordSetId, unique=False), Index("idx_GKIndexUpdate_gridKey", gridKey, unique=True), ) @property def ckiChunkKey(self): return self.gridKey @property def ckiHasEncodedData(self) -> bool: return bool(self.encodedGridTuple) @property def ckiLastUpdate(self): return self.lastUpdate @classmethod def ckiCreateDeleteEncodedChunk(cls, chunkKey: str): from peek_plugin_diagram._private.tuples.grid.EncodedGridTuple import \ EncodedGridTuple return EncodedGridTuple(gridKey=chunkKey) @classmethod def sqlCoreChunkKeyColumn(cls): return cls.__table__.c.gridKey @classmethod def sqlCoreLoad(cls, row): from peek_plugin_diagram._private.tuples.grid.EncodedGridTuple import \ EncodedGridTuple return EncodedGridTuple(gridKey=row.gridKey, encodedGridTuple=row.encodedGridTuple, lastUpdate=row.lastUpdate)
class JobDependency(db.Model): __tablename__ = 'job_dependency_v2' __table_args__ = (Index('idx_src_job_id', 'src_job_id'), Index('idx_dst_job_id', 'dst_job_id'), { 'comment': 'record job dependencies', 'mysql_engine': 'innodb', 'mysql_charset': 'utf8mb4', }) id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='id') src_job_id = db.Column(db.Integer, comment='src job id') dst_job_id = db.Column(db.Integer, comment='dst job id') dep_index = db.Column(db.Integer, comment='dep index')
def __table_args__(cls): return ( Index( f"ix_uq_version_{cls.__tablename__}", "taxonomy_item_id", "version", unique=True, ), Index( f"ix_search{cls.__tablename__}", "name", "description", **FULLTEXT_INDEX_PARAMS, ), )
class ExternalSource(DBBASE): __tablename__ = "external_sources" source_id = Column(Integer, primary_key=True) source = Column(String, unique=True) rtype = Column(String, unique=False) valid_raw = Column(Boolean) __table_args__ = ((Index("external_source_idx", "source_id"), )) def __init__(self, source, rtype, valid_raw): self.source = source if valid_raw not in (True, False): raise ValueError("\"Valid raw\" flags must be boolean!") if np.dtype("bool") == rtype: rtype = "bool" elif np.dtype("int") == rtype: rtype = "int" elif np.dtype("float") == rtype: rtype = "float" elif np.dtype("complex") == rtype: rtype = "complex" else: raise ValueError("Invalid source rtype for {}: {}".format( source, rtype)) self.rtype = rtype self.valid_raw = valid_raw
class PeekAppInfo(Tuple, DeclarativeBase): """ PeekAppInfo This table stores information on the version of Peek apps that are stored in Peek. """ __tupleType__ = 'peek_server.papp.info' __tablename__ = 'PeekAppInfo' id = Column(Integer, primary_key=True) title = Column(String, nullable=False) name = Column(String, nullable=False) version = Column(String, nullable=False) creator = Column(String, nullable=True) website = Column(String, nullable=True) buildNumber = Column(String, nullable=True) buildDate = Column(String, nullable=True) # File location columns fileName = Column(String, nullable=False) dirName = Column(String, nullable=False) __table_args__ = (Index("idx_PeekAppInfo_NameVersion", name, version, unique=True), )
def __table_args__(cls): return (Index( f"ix_search{cls.__tablename__}", "name", "description", **FULLTEXT_INDEX_PARAMS, ), )
def __table_args__(cls): return (Index( f"ix_uq_version_{cls.__tablename__}", "object_type_id", "version", unique=True, ), )
class IntegerSequencedWithIDRecord(Base): __tablename__ = 'integer_sequenced_items' # Record ID. id = Column(BigInteger().with_variant(Integer, "sqlite"), primary_key=True, index=True, unique=True) # Sequence ID (e.g. an entity or aggregate ID). sequence_id = Column(UUIDType(), nullable=False) # Position (index) of item in sequence. position = Column(BigInteger().with_variant(Integer, "sqlite"), nullable=False) # Topic of the item (e.g. path to domain event class). topic = Column(Text(), nullable=False) # State of the item (serialized dict, possibly encrypted). data = Column(Text()) __table_args__ = (Index( 'integer_sequenced_items_sequence_id_position_index', 'sequence_id', 'position', unique=True), )
class StoredEventRecord(Base): __tablename__ = 'stored_events' # Record ID. id = Column(BigInteger().with_variant(Integer, "sqlite"), primary_key=True, index=True, unique=True) # Originator ID (e.g. an entity or aggregate ID). originator_id = Column(UUIDType(), nullable=False) # Originator version of item in sequence. originator_version = Column(BigInteger().with_variant(Integer, "sqlite"), nullable=False) # Type of the event (class name). event_type = Column(Text(), nullable=False) # State of the item (serialized dict, possibly encrypted). state = Column(Text()) __table_args__ = (Index('stored_events_sequence_id_position_index', 'originator_id', 'originator_version', unique=True), )
class InteractionCategory(Base): __tablename__ = 'interaction_category' id = Column(Integer, primary_key=True) user_id = Column(ForeignKey('users.user_id'), nullable=False) interaction_id = Column(ForeignKey('interactions.id'), nullable=False) category_id = Column(ForeignKey('category.category_id'), nullable=False) sm_account_id = Column(ForeignKey('sm_accounts.sm_account_id'), nullable=False) created_date = Column(DateTime) user = relationship('User') interaction = relationship('Interactions') category = relationship('Category') sm_account = relationship('SmAccounts') __table_args__ = (UniqueConstraint('user_id', 'interaction_id', 'category_id', name='int_cat_u_idx'), Index('int_sm_cat_idx', id.desc(), sm_account_id, category_id, postgresql_where=user_id == 1))
class TaskAction(Tuple, DeclarativeBase): """ Task Action This table stores the Task Actions. Tasks have zero or more actions that can be performed by the user when they receive a task. :member title: The title of the action, this will appear as a menu option. :member confirmMessage: This is the message that will be shown to confirm the action. :member actionedPayload: This payload will be delivered locally on Peek Server When the action is performed on the user device. """ __tupleType__ = inboxTuplePrefix + 'TaskAction' __tablename__ = 'TaskAction' id = Column(Integer, primary_key=True, autoincrement=True) taskId = Column(Integer, ForeignKey("Task.id", ondelete="CASCADE"), nullable=False) task = relationship("Task", uselist=False) title = Column(String) confirmMessage = Column(String) onActionPayloadEnvelope = Column(PeekLargeBinary) __table_args__ = (Index("idx_TaskAction_taskId", taskId, unique=False), )
class WorkflowTemplate(db.Model): __tablename__ = 'template_v2' __table_args__ = (UniqueConstraint('name', name='uniq_name'), Index('idx_group_alias', 'group_alias'), { 'comment': 'workflow template', 'mysql_engine': 'innodb', 'mysql_charset': 'utf8mb4', }) id = db.Column(db.Integer, primary_key=True, comment='id') name = db.Column(db.String(255), comment='name') comment = db.Column('cmt', db.String(255), key='comment', comment='comment') group_alias = db.Column(db.String(255), nullable=False, comment='group_alias') config = db.Column(db.LargeBinary(), nullable=False, comment='config') is_left = db.Column(db.Boolean, comment='is_left') def set_config(self, proto): self.config = proto.SerializeToString() def get_config(self): proto = workflow_definition_pb2.WorkflowDefinition() proto.ParseFromString(self.config) return proto
class LocationIndexCompilerQueue(Tuple, DeclarativeBase, ACIProcessorQueueTupleABC): __tablename__ = 'LocationIndexCompilerQueue' __tupleType__ = diagramTuplePrefix + __tablename__ id = Column(BigInteger, primary_key=True, autoincrement=True) indexBucket = Column(String(100), primary_key=True) modelSetId = Column(Integer, ForeignKey('ModelSet.id', ondelete='CASCADE'), primary_key=True) __table_args__ = ( Index("idx_LICompQueue_modelSetId_indexBucket", modelSetId, indexBucket, unique=False), ) # noinspection PyUnresolvedReferences @classmethod def sqlCoreLoad(cls, row): return LocationIndexCompilerQueue(id=row.id, modelSetId=row.modelSetId, indexBucket=row.indexBucket) @property def ckiUniqueKey(self): return self.indexBucket
class ReportUnknownPackage(GenericTable): __tablename__ = "reportunknownpackages" __table_args__ = ( UniqueConstraint('report_id', 'type', 'name', 'epoch', 'version', 'release', 'arch_id'), ) id = Column(Integer, primary_key=True) report_id = Column(Integer, ForeignKey("{0}.id".format(Report.__tablename__), ondelete="CASCADE"), nullable=False) type = Column(Enum("CRASHED", "RELATED", "SELINUX_POLICY", name="reportpackage_type")) name = Column(String(256), nullable=False, index=True) epoch = Column(Integer, nullable=False) version = Column(String(64), nullable=False) release = Column(String(64), nullable=False) arch_id = Column(Integer, ForeignKey("{0}.id".format(Arch.__tablename__)), nullable=False) count = Column(Integer, nullable=False) report = relationship(Report, backref="unknown_packages") arch = relationship(Arch, primaryjoin="Arch.id==ReportUnknownPackage.arch_id") semver = Column(Semver, nullable=False) # semantic version semrel = Column(Semver, nullable=False) # semantic release Index("ix_reportunknownpackages_semver_semrel", semver, semrel) def nvr(self): return "{0}-{1}-{2}".format(self.name, self.version, self.release) def nevr(self): if not self.epoch: return self.nvr() return "{0}-{1}:{2}-{3}".format(self.name, self.epoch, self.version, self.release) def evr(self): return "{0}:{1}-{2}".format(self.epoch, self.version, self.release)
class ExtendedIntegerSequencedRecord(Base): __tablename__ = 'extended_integer_sequenced_items' id = Column(BigInteger().with_variant(Integer, "sqlite"), primary_key=True) # Sequence ID (e.g. an entity or aggregate ID). sequence_id = Column(UUIDType(), nullable=False) # Position (index) of item in sequence. position = Column(BigInteger(), nullable=False) # Topic of the item (e.g. path to domain event class). topic = Column(String(255), nullable=False) # State of the item (serialized dict, possibly encrypted). state = Column(Text()) # Timestamp of the event. timestamp = Column(DECIMAL(24, 6, 6), nullable=False) # timestamp = Column(DECIMAL(27, 9, 9), nullable=False) # Type of the event (class name). event_type = Column(String(255)) __table_args__ = (Index('integer_sequenced_items_index', 'sequence_id', 'position', unique=True), )
def createTable(self, entity): ''' Add the given entity table to schema. Arguments: entity: The SQLAlchemy entity object Returns: sqlalchemy.sql.schema.Table: The SQLAlchemy table object ''' table = entity.__table__ table._data = [] table._sorted_indexes = [] # Workaround to render table indexes in the order they were declared table.indexes = set() for column in table.columns: if column.index: table._sorted_indexes.append( Index(None, column, unique=bool(column.unique))) self.tables.append(table) return table
class LiveDbItem(Tuple, DeclarativeBase): __tupleTypeShort__ = 'LDK' __tablename__ = 'LiveDbItem' __tupleType__ = livedbTuplePrefix + __tablename__ NUMBER_VALUE = 0 STRING_VALUE = 1 COLOR = 2 LINE_WIDTH = 3 LINE_STYLE = 4 GROUP_PTR = 5 id_seq = Sequence('LiveDbItem_id_seq', metadata=DeclarativeBase.metadata, schema=DeclarativeBase.metadata.schema) id = Column(Integer, id_seq, server_default=id_seq.next_value(), primary_key=True, autoincrement=False) modelSetId = Column(Integer, ForeignKey('LiveDbModelSet.id', ondelete='CASCADE'), doc=JSON_EXCLUDE, nullable=False) modelSet = relationship(LiveDbModelSet) # comment="The unique reference of the value we want from the live db" key = Column(String, nullable=False) # comment="The last value from the source" rawValue = Column(String) # comment="The PEEK value, converted to PEEK IDs if required (Color for example)" displayValue = Column(String) # comment="The type of data this value represents" dataType = Column(Integer, nullable=False) importHash = Column(String) # Store custom props for this link propsJson = Column(String) __table_args__ = ( Index("idx_LiveDbDKey_importHash", importHash, unique=False), Index("idx_LiveDbDKey_modelSet_key", modelSetId, key, unique=True), )
class LocationIndex(Tuple, DeclarativeBase): __tablename__ = 'LocationIndex' __tupleType__ = diagramTuplePrefix + __tablename__ indexBucket = Column(String(100), primary_key=True) dispId = Column(BigInteger, ForeignKey('DispBase.id', ondelete='CASCADE'), primary_key=True) disp = relationship(DispBase) modelSetId = Column(Integer, ForeignKey('ModelSet.id'), nullable=False) modelSet = relationship(ModelSet) __table_args__ = ( Index("idx_LocationIndex_indexBucket", indexBucket, unique=False), Index("idx_LocationIndex_dispId", dispId, unique=False), Index("idx_LocationIndex_modelSetId", modelSetId, unique=False), )
class Project(db.Model): __tablename__ = 'projects_v2' __table_args__ = (UniqueConstraint('name', name='idx_name'), Index('idx_token', 'token'), { 'comment': 'webconsole projects', 'mysql_engine': 'innodb', 'mysql_charset': 'utf8mb4', }) id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='id') name = db.Column(db.String(255), comment='name') token = db.Column(db.String(64), comment='token') config = db.Column(db.LargeBinary(), comment='config') certificate = db.Column(db.LargeBinary(), comment='certificate') comment = db.Column('cmt', db.Text(), key='comment', comment='comment') created_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), comment='created at') updated_at = db.Column(db.DateTime(timezone=True), onupdate=func.now(), server_default=func.now(), comment='updated at') deleted_at = db.Column(db.DateTime(timezone=True), comment='deleted at') def set_config(self, proto): self.config = proto.SerializeToString() def get_config(self): if self.config is None: return None proto = project_pb2.Project() proto.ParseFromString(self.config) return proto def set_certificate(self, proto): self.certificate = proto.SerializeToString() def get_certificate(self): if self.certificate is None: return None proto = project_pb2.CertificateStorage() proto.ParseFromString(self.certificate) return proto def get_namespace(self): config = self.get_config() if config is not None: variables = self.get_config().variables for variable in variables: if variable.name == 'NAMESPACE': return variable.value return 'default'
class GridKeyIndex(Tuple, DeclarativeBase): __tablename__ = 'GridKeyIndex' __tupleType__ = diagramTuplePrefix + __tablename__ gridKey = Column(String(30), primary_key=True) dispId = Column(BigInteger, ForeignKey('DispBase.id', ondelete='CASCADE'), primary_key=True) disp = relationship(DispBase) coordSetId = Column(Integer, ForeignKey('ModelCoordSet.id', ondelete="CASCADE"), nullable=False) coordSet = relationship(ModelCoordSet) __table_args__ = ( Index("idx_GridKeyIndex_gridKey", gridKey, unique=False), Index("idx_GridKeyIndex_dispId", dispId, unique=False), Index("idx_GridKeyIndex_coordSetId", coordSetId, unique=False), )
class VoiceChatEvent(Event, BaseModel): __tablename__ = 'vc_events' channel_id = Column(BigInteger, nullable=False, index=True) __table_args__ = (Index('cix_vc_events', "user_id", "channel_id", "created_at"), ) def __repr__(self): s = super().__repr__()[:-2] f = ",channel_id={0.channel_id!r}".format(self) return s + f + ")>"