Смотри, допустим, emoji у тебя равно :duck:, тогда будет выполнен следующий запрос:
INSERT INTO emo VALUES (:duck:)
А надо было:
INSERT INTO emo VALUES (':duck:')
Теперь понятно?
Ладно, допусим, ты вставишь в запрос кавычки, дальше кто-нибудь добавит в код эмодзи кавычки и сможет заставить скрипт выполнить такой запрос:
INSERT INTO emo VALUES ('');DROP TABLE emo;--')
После чего таблица emo будет удалена. Нельзя просто так вставлять в запрос то, что передаёт пользователь. Надо использовать плейсхолдеры:
cursor.execute("INSERT INTO emo VALUES (?)", (emoji,))
В этом случае база сама позаботится о том, чтобы правильно использовать значения в запросах с учётом синтаксиса.