【问题标题】:What type is used to store byte strings in SQLAlchemy?SQLAlchemy 中使用什么类型来存储字节字符串?
【发布时间】:2025-12-29 03:40:16
【问题描述】:

我正在尝试使用 SQLAlchemy 将字节字符串存储在 PostgreSQL 数据库中。

我的模型如下所示:

class UserAccount(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String)
    password_hash = db.Column(db.String)
    password_salt = db.Column(db.String)

我希望 password_hashpassword_salt 都是字节字符串(即 str,因为我使用的是 Python 2.7),但即使我将字节传递给它,SQLAlchemy 似乎也会将它们变成 unicode。我也尝试在模型中使用convert_unicode=False,但得到了相同的结果。

我在 SQLAlchemy 模型中使用什么来存储字节?

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    使用LargeBinary 类型,它将在PostgreSQL 上使用bytea 类型。如果您只打算使用 PostgreSQL,也可以直接使用 BYTEA 类型。

    还有其他 SQL 标准类型,例如 BINARY,但通常使用 LargeBinary 更容易,因为 SQLAlchemy 将为每个数据库使用首选类型。

    【讨论】:

      【解决方案2】:

      对于较短的字节字符串,您还可以使用TypeDcorator 来包装String 列类。然后使用您的自定义类型类HexByteString 作为Column 类型:

      from sqlalchemy.types import Column, String, TypeDecorator
      from sqlalchemy.ext.declarative import declarative_base
      
      
      class HexByteString(TypeDecorator):
          """Convert Python bytestring to string with hexadecimal digits and back for storage."""
      
          impl = String
      
          def process_bind_param(self, value, dialect):
              if not isinstance(value, bytes):
                  raise TypeError("HexByteString columns support only bytes values.")
              return value.hex()
      
          def process_result_value(self, value, dialect):
              return bytes.fromhex(value) if value else None
      
      
      Base = declarative_base()
      
      class MyModel(Base):
          data = Column(HexByteString)
      

      然后您可以将bytes 实例分配给MyModel 实例的data 属性,它们将被转换为具有十六进制数字的字符串,并在传入/传出数据库时返回。当然,这会使存储大小翻倍,但在直接查看数据库时更容易查看列中存储的内容。

      您可以将 bytes.hex() / bytes.fromhex()(需要 Python 3.5+)替换为任何其他可以安全地将字节存储在 Ascii 字符串中的编码方案,例如 Base64 (base64.b64_encode(value).decode() / base64.b64_decode(value))。

      【讨论】: