Car*_*Ost 3 python sqlalchemy foreign-keys composite-primary-key flask-sqlalchemy
我正在尝试将表从纯 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
Run Code Online (Sandbox Code Playgroud)
我到这里来的 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']
),
)
Run Code Online (Sandbox Code Playgroud)
我想知道我是否朝着正确的方向前进。例如,我没有找到如何声明name外键约束以及如何设置INDEX. 有没有更多的Flaks-Sqlalchemy方法可以做到这一切?
@Halvor 的答案是正确的,但我只想补充一点,您有一个复合主键而不是复合外键,您有三个单列外键指向不同的表,这意味着您可以在列中声明外键定义也是:
from sqlalchemy import ForeignKey
class PerfilPlanoTransacaoModel(db.Model):
__tablename__ = 'perfil_plano_transacao'
pptr_perf_id = db.Column(
db.Integer,
ForeignKey('perfil.perf_id'),
primary_key=True,
autoincrement=False,
)
pptr_plan_id = db.Column(
db.Integer,
ForeignKey('plano.plan_id'),
primary_key=True,
autoincrement=False,
)
pptr_tran_id = db.Column(
db.Integer,
ForeignKey('transacao.tran_id'),
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)
Run Code Online (Sandbox Code Playgroud)
UsingForeignKeyConstraint比 using 更冗长,ForeignKey并且ForeignKey我们在此示例中的列定义中创建的对象最终ForeignKeyConstraint无论如何都会转换为对象,只是ForeignKey在处理单列键时使用对象更容易。中ForeignKeyConstraint定义的对象__table_args__通常仅在需要创建复合外键时直接使用,例如,如果您有另一个要引用的表perfil_plano_transacao,则它需要是复合外键,并且您必须像您一样定义它上面已经做了。
对于您的其余问题,我将遵循@Halvor 的回答。
| 归档时间: |
|
| 查看次数: |
3438 次 |
| 最近记录: |