简体   繁体   中英

SQLAlchemy raw SQL Query NoSuchColumnError

I have a relatively complex sql statement that I want to execute with sqlalchemy ORM. But when I try to do so I always get the error {NoSuchColumnError}"Could not locate column in row for column 'transaction_out.value'" . My sql statement looks as follows:

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. My database looks more or less like the one here: 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. 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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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