В настоящее время я следую этому учебнику о 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, что вызывает проблемы, или я что-то упустил?