I am trying to translate a table from pure SQL to Flask-Sqlalchemy, but the documentation available is not clear about how to do this specific scenario - Primary keys that are also foreign keys.
The SQL to build the table is the following and it works fine:
CREATE TABLE IF NOT EXISTS `ws`.`Perfil_Plano_Transacao` (
`pptr_perf_id` INT NOT NULL,
`pptr_tran_id` INT NOT NULL,
`pptr_plan_id` INT NOT NULL,
`pptr_dt_incluscao` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`pptr_dt_atualizacao` TIMESTAMP NULL,
PRIMARY KEY (`pptr_perf_id`, `pptr_tran_id`, `pptr_plan_id`),
INDEX `fk_Perfil_Plano_Transacao_Transacao1_idx` (`pptr_tran_id` ASC),
INDEX `fk_Perfil_Plano_Transacao_Plano1_idx` (`pptr_plan_id` ASC),
CONSTRAINT `fk_Perfil_Plano_Transacao_Perfil1`
FOREIGN KEY (`pptr_perf_id`)
REFERENCES `ws`.`Perfil` (`perf_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Perfil_Plano_Transacao_Transacao1`
FOREIGN KEY (`pptr_tran_id`)
REFERENCES `ws`.`Transacao` (`tran_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Perfil_Plano_Transacao_Plano1`
FOREIGN KEY (`pptr_plan_id`)
REFERENCES `ws`.`Plano` (`plan_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
And the Python code I've come until here is:
class PerfilPlanoTransacaoModel(db.Model):
__tablename__ = 'perfil_plano_transacao'
pptr_perf_id = db.Column(db.Integer, primary_key=True, autoincrement=False)
pptr_plan_id = db.Column(db.Integer, primary_key=True, autoincrement=False)
pptr_tran_id = db.Column(db.Integer, primary_key=True, autoincrement=False)
pptr_dt_inclusao = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
pptr_dt_atualizacao = db.Column(db.DateTime, nullable=True)
__table_args__ = (
db.ForeignKeyConstraint(
['pptr_perf_id', 'pptr_plan_id', 'pptr_tran_id'],
['perfil.perf_id', 'plano.plan_id', 'transacao.tran_id'],
['fk_Perfil_Plano_Transacao_Perfil1', 'fk_Perfil_Plano_Transacao_Plano1', 'fk_Perfil_Plano_Transacao_Transacao1']
),
)
I would like to know if I am going toward the right way. I dind't find, for example, how to declare the name
of the foreign key constraint and how to set the INDEX
. Is there a more Flaks-Sqlalchemy
way to do all this?