Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:无法格式化SQL查询字符串_Python_Mysql_String Formatting_Pymysql - Fatal编程技术网

Python:无法格式化SQL查询字符串

Python:无法格式化SQL查询字符串,python,mysql,string-formatting,pymysql,Python,Mysql,String Formatting,Pymysql,我想创建一个SQL查询字符串并从python中执行它 import mysql.connector from mysql.connector import Error client = mysql.connector.connect(host=sql_host, port=sql_port, database=sql_db,

我想创建一个SQL查询字符串并从python中执行它

import mysql.connector
from mysql.connector import Error


client = mysql.connector.connect(host=sql_host,
                                 port=sql_port,
                                 database=sql_db,
                                 user=os.environ['SQLUSER'],
                                 passwd=os.environ['SQLPASS']
                                 )
try:
    a = "val1"
    b = "val2"
    cursor = client.cursor()
    query = "insert into mytable values ('{}', '{}')".format(a,b)
    print(query)
    cursor.execute(query)

except Error as e:
    print(e)
这不会给我错误,但同时,没有在表中插入任何内容。我认为这是因为创建的查询字符串

“插入mytable值(\\'val1\\',\\'val2\\')”

我甚至尝试过
.replace('\\','')
,但我无法从查询字符串中删除
\\

我做错了什么

更新:

谢谢@cody的帮助。但现在,我得到了一个不同的错误

a = 'val1'
b = 'val2'
query = "insert into mytable values (%s, %s)"
print(query)
cursor.execute(query, (a,b))
client.commit()
现在我明白了


1064(42000):您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获取第1行“”附近要使用的正确语法

这是什么意思?我的价值观中甚至没有任何
'

编辑

在调查过程中,我看到
光标的
\u executed
属性如下所示

'insert into dev_test_storage values (\\'val1\\', \\'val2\\')'
为什么在执行的查询中仍然有
\\

下面是CREATETABLE语句

CREATE TABLE IF NOT EXISTS myTable 
(
    col1 varchar(50) not null,
    col2 varchar (100) not null
);

请看MySQL中的以下示例。不要对准备好的语句参数使用
format
,而是将它们作为第二个参数传递给
execute
。该示例显示了以元组和dict的形式传递数据:

from __future__ import print_function
from datetime import date, datetime, timedelta
import mysql.connector

cnx = mysql.connector.connect(user='scott', database='employees')
cursor = cnx.cursor()

tomorrow = datetime.now().date() + timedelta(days=1)

add_employee = ("INSERT INTO employees "
               "(first_name, last_name, hire_date, gender, birth_date) "
               "VALUES (%s, %s, %s, %s, %s)")
add_salary = ("INSERT INTO salaries "
              "(emp_no, salary, from_date, to_date) "
              "VALUES (%(emp_no)s, %(salary)s, %(from_date)s, %(to_date)s)")

data_employee = ('Geert', 'Vanderkelen', tomorrow, 'M', date(1977, 6, 14))

# Insert new employee
cursor.execute(add_employee, data_employee)
emp_no = cursor.lastrowid

# Insert salary information
data_salary = {
  'emp_no': emp_no,
  'salary': 50000,
  'from_date': tomorrow,
  'to_date': date(9999, 1, 1),
}
cursor.execute(add_salary, data_salary)

# Make sure data is committed to the database
cnx.commit()

cursor.close()
cnx.close()
此外,您可能需要调用
commit
,如文档所述

因为默认情况下,Connector/Python关闭自动提交,MySQL 5.5 而higher默认使用事务性InnoDB表,这是 使用连接的commit()提交更改所必需的 方法。还可以使用rollback()方法回滚

编辑:

我不确定为什么查询转义不正确时仍然存在问题,我已尽可能地复制了您的条件,并且效果良好:

表:

MariaDB [pets]> DESCRIBE myTable;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| col1  | varchar(50)  | NO   |     | NULL    |       |
| col2  | varchar(100) | NO   |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
Python代码:

import mysql.connector

cnx = mysql.connector.connect(user='cody', password='secret', database='pets')
cursor = cnx.cursor()

a = 'val1'
b = 'val2'

query = "insert into myTable values (%s, %s)"

cursor.execute(query, (a,b))

cnx.commit()

print(cursor._executed)

cursor.close()
cnx.close()
程序成功运行并按预期打印执行的查询:

cody@servo:~$ python mysql-test.py
insert into myTable values ('val1', 'val2')
并插入该行:

MariaDB [pets]> SELECT * FROM myTable;
+------+------+
| col1 | col2 |
+------+------+
| val1 | val2 |
+------+------+
1 row in set (0.01 sec)

您没有执行查询,您什么也没有执行。您的代码没有显示正在传递到光标的查询,您可以添加回溯吗?您应该使用查询参数,而不是尝试将值粘附到SQL字符串中。正如@Loocid所说,您的执行调用为空。您可能想要执行(查询)
而不是执行()。抱歉,刚刚修复了此问题,请查看最新更新。我现在得到一个不同的错误
1064(42000):您的SQL语法有一个错误;请查看与MySQL服务器版本对应的手册,以了解第1行“”附近使用的正确语法,我不确定这可能是什么,我唯一看到的问题是,您应该在连接对象上校准
commit
,而不是光标。mytable的结构是什么?你能把
descripe mytable
的输出包括进来吗?顺便问一下,你是在使用python 3吗?我很困惑,我已经尝试尽可能地复制你的条件,并且效果很好,请参见对我答案的编辑。你能发布你正在运行的整个程序吗?是的,我正在运行Python 3.5.3