flask--基础知识点--5--clickhouse_sqlalchemy的使用

1 环境

python>=2.7
此处使用的版本

解释器|第三方库version
python2.7.18
clickhouse-sqlalchemy0.1.10
clickhouse-driver0.2.0

clickhouse-sqlalchemy 依赖 clickhouse-driver,在使用pip下载clickhouse-sqlalchemy时会自动下载依赖clickhouse-driver。

2 安装

pip install clickhouse-sqlalchemy

3 demo

# -*-coding:utf-8-*-
from datetime import date, timedelta
from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
from clickhouse_sqlalchemy import get_declarative_base, types, engines
from sqlalchemy import MetaData, Column, or_

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "clickhouse://[username]:[passwd]@localhost:8123/[database_name]" # 中括号中的内容根据实际情况填写
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {'pool_size': 10, 'max_overflow': 20}
db = SQLAlchemy(app, session_options={"autoflush": False})
db.init_app(app)
db.engine.pool._use_threadlocal = True


class Rate(db.Model):
    __tablename__ = 'rate'  # 表名默认是类名的小写,当指定了__tablename__后,则表名就为该变量的值
    day = Column(types.Date, primary_key=True)
    value = Column(types.Int32)

    __table_args__ = (
        engines.Memory(),  # 注意引擎写项目中需要使用的引擎
    )
db.create_all()


@app.route("/create")
def create():
    # 方法一:单条插入
    # _model = Rate(day=date.today(), value=50)
    # db.session.add(_model)
    # db.session.commit()  # 必须有commit()

    # 方法二:批量插入
    # _model1 = Rate(day=date.today(), value=50)
    # _model2 = Rate(day=date.today() + timedelta(1), value=51)
    # _model3 = Rate(day=date.today() + timedelta(2), value=52)
    # models = [_model1, _model2, _model3]
    # db.session.add_all(models)
    # db.session.commit()  # 必须有commit()

    # 方法三:批量插入
    today = date.today()
    rates = [
        {'day': today - timedelta(i), 'value': 200 - i}
        for i in range(100)
    ]
    db.session.execute(Rate.__table__.insert(), rates)
    return jsonify(status=200, message="ok")


@app.route("/retrieve")
def retrieve():
    # 方法一:
    # data = db.session.query(Rate.day, Rate.value).filter().all()  # 获取[(day0, value0), ...] 

    # 方法二:
    _models = db.session.query(Rate).filter().all()  # 获取model列表
    data = [(_model.day, _model.value) for _model in _models]

    # 也可以使用 filter|filter_by
    # db.session.query(a, b) 参数只能是表字段,不能是表名
    # today = date.today()
    # data = db.session.query(Rate.day, Rate.value).filter(Rate.day > today - timedelta(20)).all()
    return jsonify(status=200, message="ok", data=data)


@app.route("/update/<value>")
def update(value):
    # 方法一:
    _model = db.session.query(Rate).filter_by(value=value).one()
    _model.value = int(value) - 1
    db.session.commit()  # 必须有commit()

    # 方法二:
    # _query = db.session.query(Rate).filter_by(value=value)
    # _query.update({"value": int(value) - 1}, synchronize_session=False)
    # db.session.commit()  # 必须有commit()

    # 方法三:
    # from sqlalchemy import update
    # data = {"value": int(value) - 1}
    # update_stmt = update(Rate).where(Rate.value == value).values(data)
    # db.session.execute(update_stmt)
    return jsonify(status=200, message="ok")


@app.route("/delete/<value>")
def delete(value):
    # 方法一:删除单条或多条数据
    # db.session.query(Rate).filter_by(value=value).delete()  # 单条数据删除
    # db.session.query(Rate).filter(or_(Rate.value == value, Rate.value == int(value)+1)).delete()  # 批量删除

    # 方法二:删除单条数据
    _model = db.session.query(Rate).filter_by(value=value).first()
    db.session.delete(_model)  # 删除单条数据
    db.session.commit()  # 必须有commit()

    # 方法三:删除单条或多条数据
    # from sqlalchemy import delete
    # delete_stmt = delete(Rate).where(Rate.value == value)
    # db.session.execute(delete_stmt)
    return jsonify(status=200, message="ok")


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值