Flask с помощью SQLAlchemy: невозможно адаптировать тип 'dict' - PullRequest
0 голосов
/ 28 апреля 2020

В настоящее время я следую этому учебнику о Flask и PostgreSQL (11). Это было когда-то обновлено до Python 3.8, в то время как я использую Python 3.5. Когда вызывается count_and_save_words(url), вставка данных в PostgreSQL завершается неудачно, регистрируя следующее сообщение:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'dict'
[SQL: SELECT results.id AS results_id, results.url AS results_url, results.result_all AS 
results_result_all, results.result_no_stop_words AS results_result_no_stop_words 
FROM results 
WHERE results.id = %(id_1)s 
LIMIT %(param_1)s]
[parameters: {'param_1': 1, 'id_1': {'error': ['Unable to add item to database.']}}]

в app.py:

def count_and_save_words(url):
     errors = []

     try:
        r = requests.get(url)
    except:
        errors.append(
            "Unable to get URL. Please make sure it's valid and try again."
        )
        print("-----------------#########----------------NO VALID URL ########################----------------")
        return {"error": errors}

    # text processing
    raw = BeautifulSoup(r.text, 'html.parser').get_text()
    nltk.data.path.append('./nltk_data/')  # set the path
    tokens = nltk.word_tokenize(raw)
    text = nltk.Text(tokens)
    # remove punctuation, count raw words
    nonPunct = re.compile('.*[A-Za-z].*')
    raw_words = [w for w in text if nonPunct.match(w)]
    raw_word_count = Counter(raw_words)

    # stop words
    no_stop_words = [w for w in raw_words if w.lower() not in stops]
    no_stop_words_count = Counter(no_stop_words)

    # save the results
    try:
        result = Result(
            url=url,
            result_all=raw_word_count,
            result_no_stop_words=no_stop_words_count
        )
        db.session.add(result)
        db.session.commit() <--- Fires Exception
        return result.id
    except:
        errors.append("Unable to add item to database.")
        return {"error": errors}

в models.py

class Result(db.Model):
    __tablename__ = 'results'

    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String())
    result_all = db.Column(JSON)
    result_no_stop_words = db.Column(JSON)

    def __init__(self, url, result_all, result_no_stop_words):
        self.url = url
        self.result_all = result_all
        self.result_no_stop_words = result_no_stop_words

    def __repr__(self):
        return '<id {}>'.format(self.id)

Result -значения сброшены и содержат правильные данные. Кажется, что SQLAlchemy не может обрабатывать объекты dict, созданные Counter. Что-то изменилось с Python 3,5 до Python 3,8, что вызывает проблемы, или я что-то упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...