无法使用带有mariadb连接器(python)的Set子句插入字符串



我想使用python-mariadb连接器在表中插入一个新行。为此,我更喜欢使用SET子句。出于某种原因,如果我只想保存int(即y=2(,它确实有效,但当我使用字符串时,会出现以下错误

"字段列表"中的未知列"myString">

似乎认为字符串的内容是列名?关于如何解决这个问题的任何想法(我可以用INSERT INTO…VALUES…来完成,但我想在这里使用SET子句(。根据我的理解,它应该在不引发错误的情况下保存int和str非常感谢。

参见下面的代码示例

def myfunction():
x = 1
y ='myString'
db = connect_db()
cur = db.cursor()
sql = "INSERT INTO Table SET col1={}, col2={}"
cur.execute(sql.format(x, y))
db.commit()
db.close()
return

这里是MariaDB连接器,但这应该很好,因为它适用于其他数据库函数。

import mariadb
def connect_db():
db = mariadb.connect(
user="user",
password="123",
host="localhost",
port=3306,
database="DB"
)
db.autocommit = False
return db

您没有使用正确的语法插入

sql = "INSERT INTO Table (col1,col2) values({}, {})"

但如果您想更新现有行:

sql = "UPDATE Table SET col1={}, col2={} WHERE id = {}"

可能你需要一个where子句

有问题的代码生成SQL语句:

INSERT INTO Table SET col1=1, col2=myString;

这是不正确的语法,字符串必须用单引号:

INSERT INTO Table (col1, col2) VALUES (1, 'myString');
def myfunction():
x = 1
y ='myString'
db = connect_db()
cur = db.cursor()
sql = "INSERT INTO Table (col1, COL2) VALUES ({}, '{}')"
cur.execute(sql.format(x, y))
db.commit()
db.close()
return

但上述情况是脆弱的。不要使用字符串构建方法来创建SQL语句,最好使用参数绑定。

def myfunction():
x = 1
y ='myString'
db = connect_db()
cur = db.cursor()
sql = "INSERT INTO Table (col1, col2) VALUES (?, ?)"
cur.execute(sql, (x, y))
db.commit()
db.close()
return

MariaDB连接器文档解释了这些内容。

检索数据

一旦有了初始代码,就可以开始处理数据了。你应该做的第一件事就是从数据库中检索信息。这是查询的代码对照员工数据库:

cur.execute(
"SELECT first_name,last_name FROM employees WHERE first_name=?", 
(some_name,)) 

MariaDB连接器/Python使用准备好的语句,对元组中的值进行清理并将其插入位置的问号(?(。这比插入更安全使用用户提供的f字符串或格式说明符信息

查询结果存储在光标对象的列表中。查看结果,您可以在光标上循环。

添加数据

使用与INSERT语句相同的execute((方法,可以向表中添加行。

cursor.execute(
"INSERT INTO employees (first_name,last_name) VALUES (?, ?)", 
(first_name, last_name))

最新更新