sqlite 我可以定义一个字符串来执行选择哪一列吗?

8i9zcol2  于 2023-10-23  发布在  SQLite
关注(0)|答案(1)|浏览(160)

| ID|单元|克|公里|
| --|--|--|--|
| 1 |克| 10 | 20 |
| 2 |公里| 100 | 500 |

con=sqlite3.connect(database='database.db')
    cur=con.cursor()
    try:
        cur.execute("SELECT ID,Unit FROM Product")
        rows=cur.fetchall()
        for row in rows:
            print(row[1])
            cur.execute("SELECT Unit,? FROM Product WHERE ID=?",(row[1],row[0],))
            rows2=cur.fetchall()
            print(rows2)

我可以为执行选择列定义一个字符串吗?在我的例子中,下面的单位定义采取哪个单位列,并写入表。

disho6za

disho6za1#

是的-但SQLite Python连接器上可用的字符串替换不会替换列名:它仅用于数据占位符。
要使用动态列名或表名(或SQL语法中的任何其他动态机制),只需在调用cur.execute之前使用另一种机制格式化字符串。
例如,使用f字符串:

con=sqlite3.connect(database='database.db')
    cur=con.cursor()
    try:
        cur.execute("SELECT ID,Unit FROM Product")
        rows=cur.fetchall()
        for row in rows:
            print(row[1])
            #this will interpolate "row[1]" and then call execute to interpolate the ID value;
            cur.execute(f"SELECT Unit,{row[1]} FROM Product WHERE ID=?",(row[0],))
            rows2=cur.fetchall()
            print(rows2)

请记住,当使用SQL连接器插值时,它会自动转义数据,从而避免任何SQL注入尝试。当你在调用之前插入数据时,你必须注意这一点。通常,这些数据来自受控环境,但是,例如,如果列名来自某些不受信任的输入,则必须自己进行转义。

相关问题