如何使用python在SQL Update/Select语句中插入用户变量


def update_inv_quant():
new_quant = int(input("Enter the updated quantity in stock: "))

你好!我想知道如何将用户变量插入sql语句中,以便将记录更新为所述变量。此外,如果您还能帮助我弄清楚如何将数据库的记录打印到实际的python控制台,那将非常有帮助。谢谢你!

我试着做一些像("INSERT INTO Inv(ItemName)值{user_iname)")但我并不惊讶它没有工作

如果指定一个实际的数据库会更有帮助。

第一个方法(Bad)

通常的方法(正如Graybeard在评论中所说,这是非常不鼓励的)是使用python的f-string。你可以谷歌它是什么以及如何更深入地使用它。

但基本上,假设你有两个变量user_id = 1user_name = 'fish', f-string将f"INSERT INTO mytable(id, name) values({user_id},'{user_name}')"之类的东西变成字符串INSERT INTO mytable(id,name) values(1,'fish')

正如我们前面提到的,这会导致所谓的SQL注入。youtube上有很多很好的视频,展示了这是什么,为什么它是危险的。 <标题>

第二个方法第二个方法取决于您正在使用的数据库。例如,在Psycopg2 (PostgreSQL数据库的驱动程序)中,cursor.execute方法使用以下语法来传递变量cur.execute('SELECT id FROM users WHERE cookie_id = %s',(cookieid,)),注意变量作为第二个参数在元组中传递。

所有的数据库都使用类似的方法,只有微小的差异。例如,我相信SQLite3使用?而不是psycopg2的%s。这就是为什么我说指定实际的数据库会更有帮助。

<标题>

获取记录我最熟悉PostgreSQL和psycopg2,所以你必须阅读你选择的数据库的文档。

为了获取记录,你像我们之前说的那样发送cursor.execute()查询,然后调用cursor.fetchone()返回单行,或者调用cursor.fetchall()返回可直接打印的所有行。

Execute没有更新数据库?

从驱动程序执行的语句是事务性的,这本身就是一个完整的主题,我相信在互联网上可以找到比我解释得更好的人。为了简短起见,对于物理更改数据库的语句,可以在cursor.execute()

之后调用connection.commit()

。所以最后要回答你的两个问题,请阅读数据库驱动程序的文档并查找execute方法。

这就是我所做的(这是sqlite3,将是类似的为其他SQL类型的数据库):

假设您已经连接到数据库并且表存在(否则您需要创建表)。出于本例的目的,我使用了一个名为trades的表。


new_quant = 1000
# insert one record (row)
command = f"""INSERT INTO trades VALUES (
'some_ticker', {new_quant}, other_values, ...
) """
cur.execute(command)
con.commit()
print('trade inserted !!')

你可以把上面的代码包装到你的函数中。

最新更新