I am building a FastAPI connected to a SQLite Database. The API scrapes data from the IMDB website and should send it to the database that is called by the API. The below code gives the following error at line 43: "TypeError: sqlalchemy.sql.elements.TextClause.bindparams() argument after ** must be a mapping, not str".
import uvicorn
from fastapi import FastAPI
from bs4 import BeautifulSoup
import requests
import re
from databases import Database
app = FastAPI()
@app.get("/")
async def fetch_data():
database = Database('sqlite+aiosqlite:///project.db')
await database.connect()
query3 = """DROP TABLE imdb"""
await database.execute(query=query3)
query = """CREATE TABLE imdb (id INTEGER PRIMARY KEY, movie_title VARCHAR(100), ratings DOUBLE(1,1), year INTEGER, cast VARCHAR(100))"""
await database.execute(query=query)
url = 'http://www.imdb.com/chart/top'
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
movies = soup.select('td.titleColumn')
cast = [a.attrs.get('title') for a in soup.select('td.titleColumn a')]
ratings = [b.attrs.get('data-value')
for b in soup.select('td.posterColumn span[name=ir]')]
for index in range(0, len(movies)):
movie_string = movies[index].get_text()
movie = (' '.join(movie_string.split()).replace('.', ''))
movie_title = movie[len(str(index))+1:-7]
year = re.search('\((.*?)\)', movie_string).group(1)
id = movie[:len(str(index))-(len(movie))]
values = {'id':[id],'movie_title':[movie_title],'ratings':[ratings],'year':[year],'cast':[cast]}
query2 = "INSERT INTO imdb(id,movie_title,ratings,year, cast) VALUES (:id, :movie_title, :ratings, :year, :cast)"
await database.execute_many(query=query2, values=values)
query = "SELECT * FROM imdb"
rows = await database.fetch_all(query=query)
print('IMDB:', rows)
await database.disconnect()
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=5049)
I have tried formatting the dictionary, but I still get the same error. I have tried list and map() object as well. How should I pass in a mapping object?
source https://stackoverflow.com/questions/75089354/argument-after-must-be-a-mapping-not-str-in-sqlalchemy-database
Comments
Post a Comment