在 sqlalchemy 中为 pgm_sym_decrypt 将列转换为 postgresql 中的 bytea 类型
cast column to bytea type in postgresql for pgm_sym_decrypt in sqlalchemy
请不要关闭这个问题。不是重复的
我对 fastapi 和 python 都很陌生。
我正在使用 pgcrypto
模块来加密客户的个人信息。
我的原始查询是
select pgp_sym_decrypt(cast(email as bytea), 'secret_key') as email
from customers
并且查询工作正常。
如何在 SqlAlchemy
中生成类似的东西?我试过这样的东西
from sqlalchemy import select, func, cast, LargeBinary
from sqlalchemy.dialects.postgresql import BYTEA
customer = select(func.pgp_sym_decrypt(cast(Customer.c.email, 'bytea'), 'secret_key'))
也试过
customer = select(func.pgp_sym_decrypt(cast(Customer.c.email, BYTEA), 'secret_key'))
也试过
customer = select(func.pgp_sym_decrypt(cast(Customer.c.email, LargeBinary), 'secret_key'))
但没有任何运气。
那么,如何解决这个问题呢?任何帮助,将不胜感激。提前谢谢你。
pgp_sym_decypt
函数接受一个 BYTEA
作为它的参数,但是 pgp_sym_encrypt
接受一个 VARCHAR
,所以不需要转换。
import sqlalchemy as sa
engine = sa.create_engine('postgresql+psycopg2:///test', echo=True, future=True)
tbl = sa.Table('t70770085', sa.MetaData(),
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('name', sa.String))
tbl.drop(engine, checkfirst=True)
tbl.create(engine)
SECRET = 'secret_key'
with engine.begin() as conn:
conn.execute(tbl.insert().values(name=sa.func.pgp_sym_encrypt('Alice', SECRET)))
with engine.connect() as conn:
query = sa.select(sa.func.pgp_sym_decrypt(sa.cast(tbl.c.name, sa.LargeBinary), SECRET))
result = conn.execute(query)
print(result.scalar_one())
请不要关闭这个问题。不是重复的
我对 fastapi 和 python 都很陌生。
我正在使用 pgcrypto
模块来加密客户的个人信息。
我的原始查询是
select pgp_sym_decrypt(cast(email as bytea), 'secret_key') as email
from customers
并且查询工作正常。
如何在 SqlAlchemy
中生成类似的东西?我试过这样的东西
from sqlalchemy import select, func, cast, LargeBinary
from sqlalchemy.dialects.postgresql import BYTEA
customer = select(func.pgp_sym_decrypt(cast(Customer.c.email, 'bytea'), 'secret_key'))
也试过
customer = select(func.pgp_sym_decrypt(cast(Customer.c.email, BYTEA), 'secret_key'))
也试过
customer = select(func.pgp_sym_decrypt(cast(Customer.c.email, LargeBinary), 'secret_key'))
但没有任何运气。 那么,如何解决这个问题呢?任何帮助,将不胜感激。提前谢谢你。
pgp_sym_decypt
函数接受一个 BYTEA
作为它的参数,但是 pgp_sym_encrypt
接受一个 VARCHAR
,所以不需要转换。
import sqlalchemy as sa
engine = sa.create_engine('postgresql+psycopg2:///test', echo=True, future=True)
tbl = sa.Table('t70770085', sa.MetaData(),
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('name', sa.String))
tbl.drop(engine, checkfirst=True)
tbl.create(engine)
SECRET = 'secret_key'
with engine.begin() as conn:
conn.execute(tbl.insert().values(name=sa.func.pgp_sym_encrypt('Alice', SECRET)))
with engine.connect() as conn:
query = sa.select(sa.func.pgp_sym_decrypt(sa.cast(tbl.c.name, sa.LargeBinary), SECRET))
result = conn.execute(query)
print(result.scalar_one())