【问题标题】:SQLAlchemy raw SQL Query NoSuchColumnErrorSQLAlchemy 原始 SQL 查询 NoSuchColumnError
【发布时间】:2019-09-07 05:49:50
【问题描述】:

我有一个相对复杂的 sql 语句,我想用 sqlalchemy ORM 执行。但是当我尝试这样做时,我总是收到错误{NoSuchColumnError}"Could not locate column in row for column 'transaction_out.value'"。我的sql语句如下:

sql = """
Select
    addresses.address,
    transaction_out1.value As sent,
    transaction_out1.transaction_id As sent_id,
    transactions.block As block_sent,
    transactions.time As time_sent,
    transactions.txid As txid_sent,
    "sent" as type
From
    transaction_out INNER Join
    transaction_out_address On transaction_out_address.transaction_out_id = transaction_out.id INNER Join
    addresses On transaction_out_address.address_id = addresses.id INNER Join
    transaction_in On transaction_in.transaction_out_id = transaction_out.id INNER Join
    transactions On transaction_in.transaction_id = transactions.id INNER Join
    transaction_out transaction_out1 On transaction_out1.transaction_id = transactions.id INNER Join
    transactions transactions1 On transaction_out.transaction_id = transactions1.id
WHERE addresses.address=:address_string
UNION
Select
    addresses.address,
    transaction_out.value As received,
    transaction_out.transaction_id As received_id,
    transactions.block As received_block,
    transactions.time As received_time,
    transactions.txid As received_txid,
    "received"
From
    transaction_out LEFT Join
    transaction_out_address On transaction_out_address.transaction_out_id = transaction_out.id LEFT Join
    addresses On transaction_out_address.address_id = addresses.id LEFT Join
    transaction_in On transaction_in.transaction_out_id = transaction_out.id LEFT Join
    transactions On transaction_out.transaction_id = transactions.id
WHERE addresses.address=:address_string
"""

我尝试通过以下方式执行语句:

query = session.query(Address.address, TransactionOut.value, TransactionOut.id, Block.height, Transaction.time, Transaction.txid).from_statement(
        stmt.bindparams(
            bindparam("address_string",
            value=address_string)
))

我可以使用 engine.execute() 执行原始 sql 语句而不会出现任何问题,但我需要使用 session.query() 执行此操作,因此我可以使用 sqlalchemy-datatables。我的数据库看起来或多或少像这里的数据库:https://dba.stackexchange.com/questions/137791/blockchain-bitcoin-as-a-database/137800#137800

我尝试执行它的方式有什么问题?

【问题讨论】:

  • 您是否尝试直接对数据库运行查询?看起来像一个 SQL 错误
  • @kjmerf 是的,我又试了一次。它从 mysql 控制台运行得非常好。
  • 打开引擎登录 (echo=True) 并检查您知道有效的查询与 sqlalchemy 生成的查询之间的差异。
  • @IljaEverilä 我怎样才能让它别名?

标签: python sqlalchemy


【解决方案1】:

原始 SQL 中的列别名隐藏了 SQLAlchemy 查询中的列。要么删除它们,要么改变查询以适应它们:

query = session.query(Address.address,
                      TransactionOut.value.label('sent'),
                      TransactionOut.id.label('sent_id'),
                      Transaction.block.label('block_sent'),
                      Transaction.time.label('time_sent'),
                      Transaction.txid.label('txid_sent')).\
    from_statement(stmt).\
    params(address_string=address_string)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2015-01-31
    • 2012-06-28
    • 2016-04-02
    • 2018-09-08
    • 1970-01-01
    • 2015-05-26
    • 2022-07-14
    相关资源
    最近更新 更多