SQLAlchemy中的变量链接在Where子句中不起作用

时间:2016-03-28 08:15:55

标签: postgresql sqlalchemy python-3.4

从Essential SQL Alchemy第2版本书中我采用了这个例子:

def get_orders_by_customer(cust_name):
    columns = [orders.c.order_id, users.c.username, users.c.phone,
               cookies.c.cookie_name, line_items.c.quantity,
               line_items.c.extended_cost]
    cust_orders = select(columns)
    cust_orders = cust_orders.select_from(
        users.join(orders).join(line_items).join(cookies))
    cust_orders = cust_orders.where(users.c.username == "cakeeater")
    result = connection.execute(cust_orders).fetchall()    
    return result

get_orders_by_customer("cakeeater")

但是,当我查看生成的原始SQL时,它看起来像这样:

SELECT orders.order_id, users.username, users.phone, cookies.cookie_name, line_items.quantity, line_items.extended_cost 
FROM users JOIN orders ON users.user_id = orders.user_id JOIN line_items ON orders.order_id = line_items.order_id JOIN cookies ON cookies.cookie_id = line_items.cookie_id 
WHERE users.username = :username_1

现在有趣的是,{而不是"cakeeater" SQL显示:username_1

作为逻辑结果,查询不返回任何值。

我使用的数据库是Postgres Python版本3.4.3 SQLAlchemy版本1.0.12

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

是sqlalchemy日志记录格式。 ":USERNAME_1"将由您的变量替换。 尝试运行

SELECT orders.order_id,
       users.username,
       users.phone,
       cookies.cookie_name,
       line_items.quantity,
       line_items.extended_cost
FROM users
JOIN orders ON users.user_id = orders.user_id
JOIN line_items ON orders.order_id = line_items.order_id
JOIN cookies ON cookies.cookie_id = line_items.cookie_id
WHERE users.username = 'cakeeater';

在你的psql控制台上,也许你会得到一个空的结果。

PS:检查你的sql。尝试将join替换为outerjoin