所以我正在测试 PostgreSQL 和 psycopg 的工作,并有以下代码
我的表称为汽车,有列:品牌、型号、年份、价格、id
import psycopg
k = input("")
conn = psycopg.connect(
dbname="Testing",
user="postgres",
password="my_password",
host="localhost",
port="5432"
)
cur = conn.cursor()
cur.execute("SELECT * FROM cars ORDER BY %s DESC;", (k,)) # Corrected the query here
rows = cur.fetchall()
for row in rows:
print(row)
cur.close()
conn.close()
但是当我在终端中输入
price
时,我得到了这个
price
('bmw', 'X5', 2000, 1000, 1)
('lada', 'granta', 2020, 1000, 2)
('Audi', 'A8', 2030, 200000, 3)
('audi', 'A6', 2008, 200000, 4)
('a', 'b', 2000, 2000, 5)
('mercedes', 'c-klasse', 2019, 20000, 6)
('mercedes', 'c-klasse', 2019, 20000, 7)
('Audi', 'Q7', 2020, 300000, 8)
所以数据没有被排序。如何解决
尝试将 k 替换为“价格”,但没有成功
参数绑定仅存在于值中,例如整数、字符串、日期等。列名不是值;而是值。您不能对标识符使用参数绑定。由于
k
作为值绑定到占位符,因此您的查询相当于
SELECT * FROM cars ORDER BY "price" DESC;
由于列
"price"
始终包含相同的值(即 "price"
),因此排序子句不起作用。
您必须手动将标识符放入 SQL 命令中。然而,考虑到将用户输入直接放入 SQL 会损害安全性,最好找到另一种方法(例如下拉列表,下拉列表值映射回列名称)。