TypeError: объект 'str' не вызывается при вставке данных твита в MySQL Python 3

0

Это мой код для вставки твитов в MYSQL

import pymysql
import tweepy
import time
import json
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import pymysql.cursors

ckey= ''
csecret= ''
atoken=''
asecret=''

conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='admin1234', db='mysql')
cur = conn.cursor()

class listener(StreamListener):

 def on_data(self, data):
        all_data = json.loads(data)
        tweet = all_data["text"]
        a=0
        #username = all_data["user"]["screen_name"]

        cur.execute("INSERT INTO tweet (textt) VALUES (%s)" (tweet))
        print (tweet)
        return True

def on_error(self, status):
    print (status)

auth = OAuthHandler(ckey, csecret)
auth.set_access_token(atoken, asecret)
twitterStream = Stream(auth, listener())
twitterStream.filter(track = ["puasa"])

cur.close()
conn.close()

но я получаю ошибку TypeError: 'str' object is not callable

ошибка трассировки

Traceback (most recent call last):
  File "collect-sql.py", line 40, in <module>
    twitterStream.filter(track = ["puasa"])
  File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 450, in filter
    self._start(async)
  File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 364, in _start
    self._run()
  File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 297, in _run
    six.reraise(*exc_info)
  File "/Users/amzar/anaconda3/lib/python3.6/site-packages/six.py", line 693, in reraise
    raise value
  File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 266, in _run
    self._read_loop(resp)
  File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 327, in _read_loop
    self._data(next_status_obj)
  File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 300, in _data
    if self.listener.on_data(data) is False:
  File "collect-sql.py", line 30, in on_data
    cur.execute("INSERT INTO tweet (textt) VALUES (%s)" (tweet))
TypeError: 'str' object is not callable
  • 0
    Вы пропускаете запятую в cur.execute("INSERT INTO tweet (textt) VALUES (%s)" (tweet)) после строки и перед (tweet))
  • 0
    cur.execute ("ВСТАВИТЬ В Tweet (textt) ЗНАЧЕНИЯ (% s)", (твит)) как это?
Показать ещё 5 комментариев
Теги:
tweepy
pymysql

1 ответ

1
Лучший ответ

Вам нужны две дополнительные запятые:

cur.execute("INSERT INTO tweet (textt) VALUES (%s)", (tweet,))

Первый отделяет строку запроса от аргументов, второй превращает значение в скобках в первый элемент в кортеже из 1 элемента (он действительно работал бы, если бы вы использовали только одну строку вместо кортежа, предполагая, что у вас есть только один аргумент, но это официально не поддерживается от внешнего вида вещей).

Но эта ошибка, о которой вы упомянули в комментариях:

UnicodeEncodeError: 'latin-1' codec can't encode character '\u201c' in position 97: ordinal not in range(256)

означает, что вы пытаетесь интерпретировать текст Unicode, содержащий символ из расширенного набора символов в latin-1.

Если поле уже определено внутри (в вашей базе данных mysql) как unicode, вам может потребоваться указать набор символов, который будет использоваться при подключении, например:

conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='admin1234', db='mysql', use_unicode=True, charset="utf8")

Если поле в mysql уже не похоже на utf-8, то я рекомендую вам изменить или иным образом переопределить базу данных, чтобы использовать символ юникода для этого столбца.

https://dev.mysql.com/doc/refman/8.0/en/charset-mysql.html

  • 0
    Спасибо @rbricheno за вашу помощь :)
  • 0
    Причина, по которой вам нужно преобразовать (tweet,) в кортеж, заключается в том, что строка - это итеративная последовательность. Если вы передаете в запрос одну строку, не инкапсулируя ее в другой итерируемый, вместо этого python будет перебирать символы строки и пытаться распаковать их один за другим в запрос, что почти всегда вызовет ошибку, поскольку недостаточно параметров привязки для хранения каждого символа; и это вряд ли будет тем, что вы намеревались в любом случае :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню