【发布时间】:2019-12-25 20:45:46
【问题描述】:
我正在尝试将表从纯 SQL 转换为 Flask-Sqlalchemy,但可用的文档并不清楚如何执行此特定场景 - 主键也是外键。
建表的 SQL 如下,运行良好:
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
直到这里我得到的 Python 代码是:
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']
),
)
我想知道我是否朝着正确的方向前进。例如,我没有找到如何声明外键约束的name 以及如何设置INDEX。有没有更多Flaks-Sqlalchemy 的方式来完成这一切?
【问题讨论】:
-
为什么会有多个 primary_key?为什么会这样?我想你想要一个foreingKey和一个关系字段
-
@NotSoShabby 因为在这种情况下,主键由其他 3 个表(Role、Plan 和 Transaction)的主键组成。这是一个非常常见且已知的用例。在这种情况下,此表用于向我提供配置文件在特定计划下可以进行的交易。例如:如果您支付了plan type A,并且您是vip角色,您可以进行交易X和Y,但如果您是普通角色,您可以使用交易Y。
-
其他外键不是属于其他表吗?我很确定每个表只能有一个主键。你遇到了什么错误?
-
@NotSoShabby 是的,它们属于外键预期的其他表:-)。在 SQL 上,有一个组合的主键是很常见的,并且提供的 SQL 工作正常。关键是我在 Flask-Sqlalchemy 中找不到这种特定呈现场景的示例。我还没有收到任何错误,因为我没有尝试运行代码。我正在努力寻找更好的示例,以确保它能够按预期工作,而不仅仅是工作。
标签: python sqlalchemy foreign-keys flask-sqlalchemy composite-primary-key