#python #mysql #sql #python-2.7 #mysql-python
#python #mysql #sql #python-2.7 #mysql-python
Вопрос:
Я использую python и модуль mysqldb для поиска в базе данных пользовательского ввода. Я протестировал python и установил соединение с сервером и базой данных. Это SQL-код, вызывающий у меня проблемы. Мой SQl выглядит следующим образом:
SELECT * FROM panda WHERE MATCH(Question) AGAINST('"{0}"')
Я использую python, поэтому {0} — это пользовательский ввод. этот бит работает. По какой-то причине точная фраза не будет соответствовать тому, что находится в столбце базы данных. Например, если пользователь вводит «Увидимся», база данных сопоставляет его как «Я хочу тебя видеть», а не просто «Увидимся». Есть ли какой-либо способ получить конкретную фразу? Я пытался использовать логический режим и регулярное выражение, но они не работают.
редактировать: Спасибо вам всем. Все ваши методы сработали, просто оказалось, что я неправильно отформатировал SQL. извините за все проблемы.
Комментарии:
1. Не могли бы вы немного прояснить вопрос? По какой фразе в вашей колонке вы хотите выполнить поиск? Вы хотите, чтобы оно совпадало, когда пользователь вводит точную фразу?
2. В настоящее время фраза «Увидимся» и да, точное совпадение
Ответ №1:
Тогда почему бы просто не использовать WHERE Question = ‘»{0}»‘
Ответ №2:
Вот как использовать python и sql вместе для поиска определенного столбца ‘Question’ со значением, равным InputVar, и получить всю запись в строке.
import MySQLdb
db = MySQLdb.connect("localhost", "root", "password", "MY_DATABASE")
cursor=db.cursor()
sql="SELECT * FROM MY_TABLE WHERE Question = '%s';" %inputVar;
try:
cursor.execute(sql)
row = cursor.fetchall()
print row[0] #assuming 1st column is 'Question' column.
db.commit()
except:
print ("ROLLBACK!!!")
db.rollback()
Комментарии:
1. Является ли MY_DB именем таблицы или базы данных?
2. Имя таблицы. Я отредактировал его. Также добавлена инициализация.
3. У меня там все правильно. Когда я запускаю его, я получаю сообщение об ошибке:
4. InputVar должен быть строкой. Как пользователь вводит символ? Похоже, что в вашем случае это кортеж, а не строка. Использовать команду ввода
inputVar = raw_input("Enter phrase")
?
Ответ №3:
Взгляните на документацию MATCH … ПРОТИВ. Вам нужно простое сравнение, попробуйте что-то вроде этого:
ВЫБЕРИТЕ * ИЗ panda, ГДЕ Вопрос = {0};
Комментарии:
1. Все, что я получаю, когда пытаюсь использовать этот способ, — это нетиповые ошибки, потому что модуль не нашел значение в базе данных.
2. Вы убедились, что значение находится в базе данных? Проверьте с помощью
SELECT * FROM panda
илиSELECT Question, Question = {0} FROM panda
.3. Да, это определенно есть в базе данных.
4. Какой тип столбцов (
VARCHAR
,CHAR
,TEXT
, …)?5. ДЛИННЫЙ ТЕКСТ. Должно ли это быть чем-то другим?
Ответ №4:
MATCH ... AGAINST
, также известный как ПОЛНОТЕКСТОВЫЙ поиск, выполняется так, как предназначено для вас. Его цель — копаться в большом количестве текста и находить строки, содержащие текст, соответствующий вашему запросу.
Обратите внимание, что ПОЛНОТЕКСТОВЫЙ индекс видит только первые 750 или около того символов текста в столбце.
Это полезная функциональность, потому что она работает, даже если в тексте встречаются случайные знаки препинания или другие слова. WHERE column = 'value'
требует точных совпадений.
Вы можете попробовать этот запрос: он представит результаты примерно в порядке возрастания длины. Это приведет к тому, что «Увидимся» будет предшествовать «Я хочу тебя видеть» в порядке результатов.
SELECT *
FROM panda
WHERE MATCH(Question) AGAINST('"{0}"')
ORDER BY CEIL(LOG2(LENGTH(Question))) ASC,
MATCH(Question) AGAINST('"{0}"')
Обратите внимание, что выражение MATCH(Question) AGAINST('"{0}"')
выдает число, указывающее близость совпадения, когда вы используете его в предложении SELECT
или ORDER BY
.
Обратите внимание также, что выражение CEIL(LOG2(LENGTH(Question)))
в вашем ORDER BY
предложении группирует ваши результаты по фрагментам на основе длины. Он группирует длины 3-4 вместе, затем длины 5-8, 9-16 и так далее.