python - sqlalchemy 截断标签

标签 python mysql sqlalchemy

我正在尝试将从 sql-alchemy 查询返回的字典传递给扭曲的 Perspective Broker,但出现以下错误:

Unpersistable('Unpersistable data: instance of class sqlalchemy.sql.elements._truncated_label deemed insecure')

在调查时我发现查询返回以下内容:

<class 'sqlalchemy.sql.elements._truncated_label'>对于我的标签

有人可以向我解释如何避免这种情况吗?

这是 Table 之一声明:

module_tbl = Table(
    "module",
    MetaData(),
    Column("id", Integer(), primary_key=True),
    Column("name", String()),
    Column("description", String()),
    Column("context", Integer()),
    Column("scope", Integer()),
    Column("send_body", Boolean()),
    Column("direction", Integer()),
    Column("level", Integer()),
    Column("incoming_order", Integer()),
    Column("outgoing_order", Integer()),
    Column("created_at", DateTime()),
    Column("updated_at", DateTime()), )

这里是代码错误:

@inlineCallbacks
def get_config(mname, domains, direction):
    engine = yield get_default_engine()

    # try to retrieve the module database model, raise on fail
    mod_tbl = getattr(ddl, mname + '_tbl')
    if mod_tbl is None:
        raise ModuleBindException('Could not find a database model for module <%s>' % mname)

    # convert domains to list
    if not isinstance(domains, list):
        domains = [domains]

    _select = [ddl.domain_module_tbl, ddl.domain_tbl, ddl.module_tbl, mod_tbl]
    _from = ddl.domain_module_tbl
    _join = [(ddl.domain_tbl, ddl.domain_module_tbl.c.domain_id ==
              func.COALESCE(ddl.domain_tbl.c.master_domain_id, ddl.domain_tbl.c.id)),
             (mod_tbl, ddl.domain_module_tbl.c.id == mod_tbl.c.domain_module_id),
             (ddl.module_tbl, ddl.domain_module_tbl.c.module_id == ddl.module_tbl.c.id), ]
    _where = [ddl.domain_module_tbl.c.enabled == 1,
              ddl.domain_module_tbl.c.direction.op('&')(direction),
              ddl.module_tbl.c.name == mname,  # optional but enforces security on blind join
              ddl.domain_tbl.c.name.in_(tuple(domains))]

    for j in _join:
        _from = _from.join(*j)

    _stmt = select(_select).select_from(_from)
    for w in _where:
        _stmt = _stmt.where(w)

    # use aliasing
    _stmt = _stmt.apply_labels()

    # query
    result = yield engine.execute(_stmt)
    config = yield result.fetchall()
    config_per_domain = dict()
    mod_prefix = '%s_' % mname
    for c in config:
        # rename the mod_{name}_* keys to mod_* so it's easier to access from modules
        cfg = dict((k, v) for k, v in dict(c).items() if not k.startswith(mod_prefix))
        mod_cfg = dict((str('mod_%s' % k[len('%s_' % mname):]), v) for k, v in dict(c).items()
                       if k.startswith(mod_prefix))
        cfg.update(mod_cfg)
        config_per_domain[cfg.get('domain_name')] = cfg

    defer.returnValue(config_per_domain)

最佳答案

_truncated_labelunicode(或 Python 3 中的 str)的子类。如果您使用的库编写正确,它将使用 isinstance 而不是 type() 来检查某物是否为字符串。

无论如何,这个子类通常用于列、索引和类似数据库对象的名称,当您需要在自己的代码中使用这些名称时,您可以简单地使用 unicode(whatever) 代替只是 whatever 将其转换为普通的 unicode 对象(str 如果您使用的是 Python 3)。

关于python - sqlalchemy 截断标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34919410/

相关文章:

python - 训练时 Tensorflow 形状不兼容错误

mysql - 一个外键引用不同表的两个主键?

mysql - 有关 mysql 的 Perl 问题 :Can't locate object method "connect" and Can't use string ("") as a HASH

mysql - 如何在查询构建器中使用插入插入多条记录?

python - SQLAlchemy:插入的刷新顺序错误?

python - SQLAlchemy "default"与 "server_default"性能对比

Python - 通过 pandas 数据帧迭代并分配和有条件更新日期时间变量

python - 计算前 1000 个阶乘的累加和?

Python、SqlAlchemy : Many to many relationship, 找到那些没有的

python - 非贪婪正则表达式不会终止