Python: невозможно отформатировать строку запроса SQL - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу создать строку 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)

Это не дает мне ошибки, но в то же время ничего не вставляется в таблицу.Я думаю, это потому, что строка запроса, которая создается, выглядит как

"insert into mytable values (\\'val1\\', \\'val2\\')"

Я даже пытался .replace('\\',''), но я не могу удалить \\ s из моей строки запроса.

Что я делаю не так?

ОБНОВЛЕНИЕ:

Спасибо @cody за вашу помощь.Но теперь я получаю другую ошибку

a = 'val1'
b = 'val2'
query = "insert into mytable values (%s, %s)"
print(query)
cursor.execute(query, (a,b))
client.commit()

Теперь я получаю

1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

что это значит?У меня даже нет '' в моих значениях

РЕДАКТИРОВАТЬ

Во время исследования я вижу, что атрибут _executed cursor выглядит следующим образом

'insert into dev_test_storage values (\\'val1\\', \\'val2\\')'

почему у меня все еще есть \\ в запросе, который выполняется?

Вот инструкция создания таблицы

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

1 Ответ

0 голосов
/ 22 ноября 2018

Посмотрите на следующий пример в документации MySQL connector-python для вставки .Не используйте 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, поскольку в документации указано

С по умолчанию Соединитель/ Python отключает автокоммит, а MySQL 5.5 и выше по умолчанию использует транзакционные таблицы 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)
...