SQLAlchemy & Postgresql
Peter Otten
__peter__ at web.de
Thu May 28 14:47:38 EDT 2020
Buddy Peacock wrote:
> Hello group,
> I have a pretty good background in MySQL & MSSQL as well as VB & Php, but
> I am new to Python and Postgresql.
>
> I am taking a class and working on a project to insert authors and books
> into a table. My code for this is:
> ===============================================================
> import csv
> import os
>
> from flask import Flask
> from sqlalchemy import create_engine
> from sqlalchemy.orm import scoped_session, sessionmaker
>
> app = Flask(__name__)
>
> # Configure session to use filesystem
> app.config["SESSION_PERMANENT"] = False
> app.config["SESSION_TYPE"] = "filesystem"
> # Session(app)
>
> # Set up database
> engine = create_engine(os.getenv("DATABASE_URL"))
> db = scoped_session(sessionmaker(bind=engine))
>
> print (os.getenv("DATABASE_URL"))
>
> def main():
> f = open("books.csv")
> reader = csv.reader(f)
> for isbn, title, author, year in reader:
> if db.execute("SELECT * FROM authors WHERE name = :author",
> {"name": author}).rowcount == 0:
> db.execute("INSERT INTO authors (name) VALUES (author)")
>
> print(f" {author} was read.")
> db.commit()
>
> if __name__ == "__main__":
> main()
> ====================================================================
> If I comment out the "if" statement then the authors all print on screen.
> But when I run this with the if statement I am getting a message that
> says: ssqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError)
> A value is required for bind parameter 'author'
> [SQL: SELECT * FROM authors WHERE name = %(author)s]
> [parameters: [{'name': 'author'}]]
>
> What am I missing?
The variable name for name is :author. Therefore I think you have to use
"author" as the key in the dict:
db.execute("SELECT * FROM authors WHERE name = :author", {"author": author})
More information about the Python-list
mailing list