【问题标题】:python sqlite3 pickle type column has default valuepython sqlite3 pickle 类型列具有默认值
【发布时间】:2015-01-24 13:21:33
【问题描述】:

我们知道在数据库系统中(在我的例子中,我们使用 sqlite3 为例),我们可以使用 BLOB 类型(二进制)或 TEXT 类型来存储任何可腌制对象。

data = [1,2,3] # b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
create table test (value BLOB)
cursor.execute("insert into test values (?)", (pickle.dumps(data),)
## this works

但是如果我们想为列设置一个默认值呢? 例如

create table test (value BLOB default b'\x80\x03]q\x00(K\x01K\x02K\x03e.')
## obviously this is not working.

我知道一个解决方案是使用 base64

## because we know base64.b64encode(pickle.dumps([1,2,3])) =
## 'gANjYnVpbHRpbnMKc2V0CnEAXXEBKEsBSwJLA2WFcQJScQMu'
## so we can use:
create table test (value BLOB default 'gANjYnVpbHRpbnMKc2V0CnEAXXEBKEsBSwJLA2WFcQJScQMu')

但据我所知,在 SqlAlchemy PickleType 中,它们没有使用 base64 编码。因为这需要额外的时间。

任何人都知道如果我们想为 pickletype 列设置默认值,我应该怎么做?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    sqlite 使用 'x' 或 'X' 为 BLOB 字符串文字 (https://www.sqlite.org/lang_expr.html#hexint) 加上前缀,所以虽然这 b'\x80\x03]q\x00(K\x01K\x02K\x03e.' 不起作用。这应该:

    create table test (value BLOB default X'80035d7100284b014b024b03652e')
    

    【讨论】:

    • 你的回答太棒了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多