[英]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.