简体   繁体   English

SQLAlchemy原始SQL查询NoSuchColumnError

[英]SQLAlchemy raw SQL Query NoSuchColumnError

I have a relatively complex sql statement that I want to execute with sqlalchemy ORM. 我有一个要使用sqlalchemy ORM执行的相对复杂的sql语句。 But when I try to do so I always get the error {NoSuchColumnError}"Could not locate column in row for column 'transaction_out.value'" . 但是,当我尝试这样做时,总是会收到错误{NoSuchColumnError}"Could not locate column in row for column 'transaction_out.value'" My sql statement looks as follows: 我的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
"""

And I tried to execute the statement in the following way: 我尝试通过以下方式执行该语句:

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)
))

I can execute the raw sql statement with engine.execute() without any problems but I need to do it with session.query() so I can use sqlalchemy-datatables. 我可以使用engine.execute()执行原始sql语句而不会出现任何问题,但是我需要使用session.query()来执行它,因此可以使用sqlalchemy-datatables。 My database looks more or less like the one here: https://dba.stackexchange.com/questions/137791/blockchain-bitcoin-as-a-database/137800#137800 . 我的数据库或多或少类似于此处的数据库: https : //dba.stackexchange.com/questions/137791/blockchain-bitcoin-as-a-database/137800#137800

What is the problem with the way I try to execute it? 我尝试执行它的方式有什么问题?

The column aliases in the raw SQL are hiding the columns from the SQLAlchemy query. 原始SQL中的列别名将隐藏SQLAlchemy查询中的列。 Either remove them, or alter the query to accommodate them: 删除它们,或更改查询以适应它们:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM