分享

peewee与mysql的使用

 AI量化实验室 2023-10-12 发布于北京

原创文章第145篇,专注“个人成长与财富自由、世界运作的逻辑,AI量化投资"。

Dagster 是一个编排器,旨在开发和维护数据资产,例如表、数据集、机器学习模型和报告。

您声明要运行的函数以及这些函数生成或更新的数据资产。然后,Dagster 会帮助您在正确的时间运行您的功能并让您的资产保持最新。

Dagster 旨在用于数据开发生命周期的每个阶段——本地开发、单元测试、集成测试、暂存环境,一直到生产。

这与我上次调研的,似乎已经发生了变化。上次调研时,对比了airflow, prefect和dagster。是按调度平台来调研的。目前看,官方定位是数据编排器。看起来与大数据、AI项目相关,这倒与AI量化投资可以契合。现在它的核心概念是“数据资产”。

Prefect也进行了大改版,易用性提升了不少。当然,它仍然是一个“去中心化”的调度器,就是server端只负责记录,worker自己启动后去消费队列。对比而言,dagster往更复杂的方向去了,引入了assets为核心,加上了“物化”的概念,云里雾里的。

python生态的web框架,以django, flask和fastapi为代表。django是快速交付的代表,分分钟建一个自带后端的系统,几行代表就够了。但你想替换它原生的组件,比如想使用no sql数据库,如mongo就比较费劲,或者换一个模板引擎,比如Jinjia2,都比较麻烦。另外就是考虑到分布式、高并发的场景,那么传统后端session的模式基本就没有用了,另外对于事务的支持,连接池的支持,这些使用django就比较麻烦了。django最强的两大组件,一是orm;二是admin。但它的admin与orm绑定太紧了。若有定制需求,要突破也不容易。

flask以“微内核”架构,它基本可以“拼装”出一个django,好处是,有很多组件供选择。

当下更多的场景以“前后端分离为主”,后端提供api。那么fastapi优于flask。它自动参数校验,完美整合swagger,原生异步框架等。

ORM今天我来试一下peewee。

pip install peewee

peewee很小,才800多k,sqlalchemy使用繁琐,不那么pythonic。

有时候想想,是否一定要用orm,尤其是一上来就学习orm的同学,离开了orm便不会操作数据库了。其实纯粹的sql操作,也没有多复杂,只是麻烦罢了,早年我们写代码,都会自己封装一层db的操作。

把orm当成自动表结构与python的model对象关联,同时它的playhouse也提供手动migrations。其实这样挺好,自动migrate

使用docker-compose 将mongo与mysql启动:

version: '3'
services:
mongo:
image: 'mongo:4.0'
container_name: mymongo
volumes:
- /root/data/mongo:/data/db
ports:
- 2020:27017
command: mongod --bind_ip_all --auth

mysql:
image: mysql
# NOTE: use of "mysql_native_password" is not recommended: https://dev./doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password
# (this is just an example, not intended to be a production configuration)
command: --default-authentication-plugin=mysql_native_password
restart: always
ports:
- 3306:3306
volumes:
- /root/data/mysql:/var/lib/mysql
environment:

使用docker一样简单,只不过mongo的密码与用户在终端里管理,而mysql是直接在环境变量里配置。

实例化一个MySQLDatabase,然后把它作为BaseModel的Meta的database的值。

db = MySQLDatabase(database=database, host=host, port=port, user=user, passwd=passwd)


class BaseModel(Model):
class Meta:
database = db

Users用户表继承自BaseModel都会与数据库里的Users表自动关联。

class Users(BaseModel):
# CharField->varchar null->非空约束
name = CharField(verbose_name='姓名', max_length=10, null=False)
passwd = CharField(verbose_name='密码', max_length=20, null=False)
phone = FixedCharField(verbose_name='手机号')

代码非常简洁,但这里有些问题:

连接池的管理,事务如何处理?

db = SqliteDatabase(':memory:')

with db.atomic() as txn:
# This is the outer-most level, so this block corresponds to
# a transaction.
User.create(username='charlie')

with db.atomic() as nested_txn:
# This block corresponds to a savepoint.
User.create(username='huey')

# This will roll back the above create() query.
nested_txn.rollback()

User.create(username='mickey')

连接池:

# 同步数据库连接池
from playhouse.pool import PooledMySQLDatabase

# 数据库实例
db = PooledMySQLDatabase(**db_config, max_connections=10)

peewee很简洁,代码也很容易看明白。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多