Не зная много о вашей базе данных, я думаю, что вы должны просто дать отображению Integer Primary Key и добавить уникальное ограничение на два поля, которые вы хотите иметь уникальными.
Например:
from sqlalchemy import UniqueConstraint
class SiteRoleMapping(db.Model):
__table_name__ = "site_role_mapping"
id = Column(Integer, primary_key)
site_id = Column(ForeignKey('cmp_site.id', ondelete='CASCADE'), nullable=False)
device = Column(String, primary_key=True)
rolename = Column(String)
description = Column(String, default="None")
# add unique constraint
__table_args__ = (UniqueConstraint('site_id', 'device'), )
Однако, читая сопоставление имен таблиц, создается впечатление, что вы реализуете связь «многие ко многим» между сайтами и ролями. Обычно это делается с использованием трех таблиц, одной для сайтов, одной для ролей и одной для сопоставления
Так что можно ожидать, что в сопоставлении будут два внешних ключа, а не один.