Форматирование строки Python выдает ошибку при применении в mysql - PullRequest
0 голосов
/ 04 ноября 2018

Я написал скрипт на python, чтобы очистить некоторые данные с веб-сайта и сохранить их в mysql. Мой скрипт успешно выполнит эту работу, если я выберу две опции для вставки данных:

mycursor.execute("INSERT INTO webdata (name,bubble,review) VALUES ('{}','{}','{}')".format(name,bubble,review))
mycursor.execute("INSERT INTO webdata (name,bubble,review) VALUES (%s,%s,%s)",(name,bubble,review))

Однако, это выдает ошибку, когда я пытаюсь сделать то же самое, используя новое форматирование строки Python как показано ниже:

mycursor.execute("INSERT INTO webdata (name,bubble,review) VALUES (f'{name},{bubble},{review}')")

Ошибка выдает:

line 429, in _handle_result
    raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''{name},{bubble},{review}')' at line 1

Где я ошибаюсь и как это исправить, так как я очень хочу придерживаться последнего стиля форматирования?

Ответы [ 3 ]

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

Лучше позволить MySQL, Connector связывать переменные, используя% s. Это позволяет избежать внедрения SQL. Вот рабочий пример.

import MySQLdb

# set up db connection
dbApi = MySQLdb
connection = MySQLdb.connect(
    host    = <hostname>,
    user    = <databasename>,
    passwd  = password,
    db      = <dbname>,
    port    = 3306,
    charset = "utf8")
cursor = connection.cursor(dbApi.cursors.DictCursor)

# insert records
records = [['George', 'Ten', 'Good'],
           ['Ringo', 'Ten', 'Good'],
           ['Paul', 'Ten', 'Good'],
           ['John', 'Ten', 'Good']]
insert_sql = 'insert into webdata (name, bubble, review) values (%s, %s, %s)'

for record in records:
    cursor.execute(insert_sql, record)

# list record
sql = 'select * from webdata'
cursor.execute(sql)
data = cursor.fetchall()
print 'data:', data

connection.commit()
cursor.close()
0 голосов
/ 18 ноября 2018

всегда есть альтернативы. Хотя f-strings с базами данных не рекомендуется или безопасно использовать, но все же это возможно. Проверьте это:

mycursor.execute(f"INSERT INTO webdata (name,bubble,review) VALUES ('{name}','{bubble}','{review}')")
0 голосов
/ 04 ноября 2018

Нельзя использовать f-строки с базами данных, просто если вы хотите написать код, не уязвимый для уязвимостей SQL-инъекций.

...