繁体   English   中英

在唯一约束 sqlalchemy model 中创建列的 MD5

[英]Create MD5 of column in unique constraint sqlalchemy model

我的 model 如下所示,我希望使用 md5 hash 但func.md5(col2)不起作用的特定列上的唯一索引。

class TestClass(db.Model):
    __tablename__ = 'my_table'
    id = db.Column(db.BigInteger, primary_key=True, autoincrement=True)
    col1 = db.Column(db.String)
    col2 = db.Column(db.String)
    col3 = db.Column(db.Numeric)
    
    __table_args__ = (
        UniqueConstraint('col1', func.md5(col2), name='my_table_unique_idx')
    )

有很多解决方案。 ORM 解决方案如下所示:

from sqlalchemy import *
from sqlalchemy import event
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base


username = 'postgres'
password = 'root'
servername = 'localhost'
databasename = 'database_name'
conn_string = f'postgresql+psycopg2://{username}:{password}@{servername}/{databasename}'

Base = declarative_base()


def add_hash(mapper, connection, table, *args, **kvargs):
    table.col1 = func.md5(table.col2)


class TestClass(Base):
    __tablename__ = 'my_table'

    id = Column(BigInteger, primary_key=True, autoincrement=True)
    col1 = Column(String, unique=True, nullable=False)
    col2 = Column(String)
    col3 = Column(Numeric)


if __name__ == '__main__':
    engine = create_engine(conn_string)

    # create table if it doesn't exist
    Base.metadata.create_all(engine)

    # example when inserting record
    event.listen(TestClass, "before_insert", add_hash)
    with sessionmaker(engine)() as session:
        new_record = TestClass(col2='test row2', col3=1.2)
        session.add(new_record)
        session.commit()

第二种解决方案是使用 SQL 创建触发器。

create or replace function fn_insert_md5() returns trigger as $$
begin
    if NEW.col1 is null then
        NEW.col1 := md5(NEW.col2);
    end if;
    return new;
end;
$$ language plpgsql;


create trigger trig_insert_md5
before insert
on my_table
for each row
execute procedure fn_insert_md5();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM