Sqlalchemty

Нам понадобится установить пакет psycopg2-binary.


pip install psycopg2-binary

  • SQLalchemy библиотека Python с её помощью мы можем выполнять SQL запросы.
  • Начнём с кода выводящего информацию из таблицы flights:
    	
    import os
    from sqlalchemy import create_engine
    from sqlalchemy.orm import scoped_session, sessionmaker
    from sqlalchemy.sql import text
    database_url = os.getenv('DATABASE_URL')
    engine = create_engine(database_url)
    db = scoped_session(sessionmaker(bind=engine))
    
    def main():
    	flights = db.execute(text('SELECT origin, destination, duration FROM flights')).fetchall()
    	for flight in flights:
    		print(f"{flight.origin} to {flight.destination}, {flight.duration} minutes.")
    
    if __name__ == "__main__":
    	main()
    	
    	
  • Запрос на вставку данных в таблицу из csv файла:
    		
    import csv
    import os
    
    from sqlalchemy import create_engine
    from sqlalchemy.orm import scoped_session, sessionmaker
    from sqlalchemy.sql import text
    
    engine = create_engine(os.getenv("DATABASE_URL"))
    db = scoped_session(sessionmaker(bind=engine))
    
    def main():
        f = open("flights.csv")
        reader = csv.reader(f)
        for origin, destination, duration in reader:
            db.execute(text("INSERT INTO flights (origin, destination, duration) VALUES (:origin, :destination, :duration)"),
                        {"origin": origin, "destination": destination, "duration": duration})
            print(f"Added flight from {origin} to {destination} lasting {duration} minutes.")
        db.commit()
    
    if __name__ == "__main__":
        main()
        
    		

Sqlalchemy с Flask

  • Приведём пример кода:
    		
    import os
    from flask import Flask, render_template, request, url_for
    from sqlalchemy import create_engine
    from sqlalchemy.sql import text
    from sqlalchemy.orm import scoped_session, sessionmaker
    database_url = os.getenv("DATABASE_URL")
    engine = create_engine(database_url)
    db = scoped_session(sessionmaker(bind=engine))
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        flights = db.execute(text('select * from flights')).fetchall()
        return render_template('index.html', flights = flights)
    
    @app.route('/book', methods=["POST"])
    def book():
        """Book a flight."""
    
        # Get form information.
        name = request.form.get("name")
        try:
            flight_id = int(request.form.get("flight_id"))
        except ValueError:
            return render_template("error.html", message="Invalid flight number.")
    
        # Make sure the flight exists.
        if db.execute(text("SELECT * FROM flights WHERE id = :id"), {"id": flight_id}).rowcount == 0:
            return render_template("error.html", message="No such flight with that id.")
        db.execute(text("INSERT INTO passengers (name, flight_id) VALUES (:name, :flight_id)"),
                {"name": name, "flight_id": flight_id})
        db.commit()
        return render_template("success.html")
    
    @app.route("/flights")
    def flights():
        """Lists all flights."""
        flights = db.execute(text("SELECT * FROM flights")).fetchall()
        return render_template("flights.html", flights=flights)
    
    @app.route("/flights/<int:flight_id>")
    def flight(flight_id):
        """Lists details about a single flight."""
    
        # Make sure flight exists.
        flight = db.execute(text("SELECT * FROM flights WHERE id = :id"), {"id": flight_id}).fetchone()
        if flight is None:
            return render_template("error.html", message="No such flight.")
    
        # Get all passengers.
    
    		
  • Создадим flights.html
    	
    	
    	
  • Создадим index.html.
    
    
    
  • flight.html