跳转至

Vertica 集成 Flask

关于本文档

本文档的目标是集成 Vertica 与 Flask。我们使用 vertica-python 驱动来连接 Vertica 和 Flask。此集成使您能够向 Vertica 数据库填充数据、更新和删除数据。

Apache Flask 概述

Flask 是一个用 Python 开发的微 Web 框架,用于轻松开发 Web 应用程序。Flask 框架可以安装在任何安装了 Python 3 的操作系统上。

测试环境

在此探索中,我们使用了以下环境和版本:

  • 操作系统:RHEL 8.4
  • Python 版本:3.6.8
  • pip 最新版本
  • Flask 版本:2.0.2

前提条件

在将 Flask 连接到 Vertica 之前,需要安装 vertica-python 驱动。为此,在 RHEL 命令行中运行以下命令:

pip3.6 install vertica-python

将 Flask 连接到 Vertica

  1. 创建 flask_sqlalchemy_vertica_python 目录并添加文件,如下图所示:

截图

  1. EmployeeData.py 文件中,添加以下代码。将 SQLALCHEMY_DATABASE_URI 更新为 Vertica 数据库的用户名、密码、服务器 IP 和数据库名称。
import os
from flask import Flask
from flask import render_template
from flask import request
from flask import redirect
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.update(
    SECRET_KEY='',
    SQLALCHEMY_DATABASE_URI='vertica+vertica_python://dbadmin:<password>@<Vertica_IP_Address>:5433/VMart',
    SQLALCHEMY_TRACK_MODIFICATIONS=False
)
db = SQLAlchemy(app)

class Employee(db.Model):
    emp_name = db.Column(db.String(80), unique=True, nullable=False, primary_key=True)
    def __repr__(self):
        return "<Employeename: {}>".format(self.emp_name)

@app.route("/", methods=["GET", "POST"])
def home():
    employees = None
    if request.form:
        try:
            employee = Employee(emp_name=request.form.get("emp_name"))
            db.session.add(employee)
            db.session.commit()
        except Exception as e:
            print("Failed to show employee name ")
            print(e)
    employees = Employee.query.all()
    return render_template("home.html", employees=employees)

@app.route("/update", methods=["POST"])
def update():
    new_name = request.form.get("newname")
    employees = Employee.query.filter_by(emp_name=request.form.get("oldname")).first()
    if employees:
        db.session.delete(employees)
        db.session.commit()
        employees = Employee(emp_name=new_name)
        db.session.add(employees)
        db.session.commit()
    return redirect("/")

@app.route("/delete", methods=["POST"])
def delete():
    emp_name = request.form.get("delname")
    employees = Employee.query.filter_by(emp_name=emp_name).first()
    db.session.delete(employees)
    db.session.commit()
    return redirect("/")

if __name__ == "__main__":
    db.create_all()
    app.run(host='<FlaskServer_IP_Address>')
  1. 将代码最后一行中的 IP 地址更新为 Flask 安装所在的 IP 地址。

  2. home.html 文件中包含以下脚本:

<html>
<style>
table#addnew{
    table-layout: fixed;
    width: 50%;
    font-family: Arial, Helvetica, sans-serif;
}
table#showdetails,td, th, td {
    table-layout: fixed;
    width: 50%;
    font-family: Arial, Helvetica, sans-serif;
}
h1,h3 {
    color: blue;
    font-family: Arial, Helvetica, sans-serif;
}
div#f{
    border: 3px solid black;
    width: 100%;
    height: 500px;
}
</style>
<body>
<h1><center>Flask Vertica Integration Demo</center></h1>
<div id="f">
    <div id="flask">
        <div id="a">
            <table id='addnew' align="center">
                <tr>
                    <form method="POST" action="/">
                    <h3><center>Add New Employee</center></h3>
                </tr>
                <tr>
                    <td>Enter Employee Name</td>
                    <td><input type="text" name="emp_name"></td>
                    <td><input type="submit" value="Add"></td>
                </tr>
            </table>
            </form>
        </div>
        <div id="c">
            <table id='showdetails' align="center">
                <tr><h3><center>Employees Data</center></h3></tr>
                <tr align="left">
                    <th>Old Name</th><th>New Name</th><th> </th>
                </tr>
                <tr><td>{% for employee in employees %}</td></tr>
                <tr>
                    <td>{{employee.emp_name}}</td>
                    <form method="POST" action="./update" style="display: inline">
                    <td>
                        <input type="hidden" value="{{employee.emp_name}}" name="oldname">
                        <input type="text" value="{{employee.emp_name}}" name="newname">
                    </td>
                    <td align="center">
                        <input type="submit" value="Update">
                    </td>
                    </form>
                    <td>
                        <form method="POST" action="./delete" style="display: inline">
                        <input type="hidden" value="{{employee.emp_name}}" name="delname">
                        <input type="submit" value="Delete">
                        </form>
                    </td>
                </tr>
                {% endfor %}
            </table>
        </div>
    </div>
</div>
</body>
</html>
  1. requirements.txt 文件中包含以下命令:

    pip3.6 install flask
    pip3.6 install flask-sqlalchemy
    pip3.6 install sqlalchemy-vertica
    pip3.6 install sqlalchemy-vertica-python
    

  2. 执行以下命令安装 flask 依赖:

    $./requirements.txt
    

  3. 执行以下命令运行 flask 应用程序。应用程序日志将记录到 flask.log 文件中:

    $python3.6 EmployeeData.py > flask.log &
    

  4. 命令成功执行后,显示消息 * Running on http://<FlaskServer_IP_Address>:5000

截图

  1. 打开链接 http://<FlaskServer_IP_Address>:5000/。Flask 框架显示 home.html 网页,其中包含来自 Vertica 服务器的数据。

截图

更多信息

关于... 参见...
Flask 网站 https://flask.palletsprojects.com/en/2.0.x/
Vertica Community Edition https://vertica.com/community/
Vertica 文档 http://vertica.com/docs/latest/HTML/index.htm
Vertica User Community https://vertica.com/big-data-analytics-community-content/

原文来源:https://www.vertica.com/kb/Flask_TE/Content/Partner/Flask_TE.htm