库扩展了sqlalchemy模块,使crud更加容易。
sqlalchemy-mate的Python项目详细描述
欢迎使用sqlalchemy_mate文档
一个扩展sqlalchemy模块的库,可以让你节省50%的数据库。
功能
Read Database Credential Safely
将数据库连接凭据放在源代码中总是一个坏主意。
sqlalchemy_mate提供了几个选项,允许轻松加载凭据。
如果您想从其他源(例如具有大量export DB_PASSWORD="xxx"、aws secret manager、aws密钥管理系统(kms)的bash脚本)读取db secret,请查看我的另一个项目pysecret。
From json file
您可以将凭证放在$home目录中的某个json文件中,然后让sqlalchemy_mate智能地从中加载。
您需要指定两件事:
- json文件的路径。
- 数据的字段路径。如果connect信息深深地嵌套在json中,则可以使用点表示法json path来指向它。
json的内容:
{"credentials":{"db1":{"host":"example.com","port":1234,"database":"test","username":"admin","password":"admin",},"db2":{...}}}
代码:
fromsqlalchemy_mateimportEngineCreatorec=EngineCreator.from_json(json_file="path-to-json-file",json_path="credentials.db1",# dot notation json path)engine=ec.create_postgresql_psycopg2()
默认数据字段是host,port,database,username,password。
如果json模式不同,则需要将key_mapping添加到指定字段名映射:
ec=EngineCreator.from_json(json_file="...",json_path="...",key_mapping={"host":"your-host-field","port":"your-port-field","database":"your-database-field","username":"your-username-field","password":"your-password-field",})
From ^{tt2}$
您可以将大量数据库连接信息放在.db.json文件的$HOME目录中。
fromsqlalchemy_mateimportEngineCreatorec=EngineCreator.from_home_db_json(identifier="db1")engine=ec.create_postgresql_psycopg2()
$HOME/.db.json采用平面json模式,但可以使用点表示法json path for identifier来适应任何json模式:
{"identifier1":{"host":"example.com","port":1234,"database":"test","username":"admin","password":"admin",},"identifier2":{...}}
From json file on AWS S3
这类似于from_json,但是json文件存储在aws s3上。
fromsqlalchemy_mateimportEngineCreatorec=EngineCreator.from_s3_json(bucket_name="my-bucket",key="db.json",json_path="identifier1",aws_profile="my-profile",)engine=ec.create_redshift()
From Environment Variable
您可以将凭证放入环境变量中。例如:
exportDB_DEV_HOST="..."exportDB_DEV_PORT="..."exportDB_DEV_DATABASE="..."exportDB_DEV_USERNAME="..."exportDB_DEV_PASSWORD="..."
fromsqlalchemy_mateimportEngineCreator# read from DB_DEV_USERNAME, DB_DEV_PASSWORD, ...ec=EngineCreator.from_env(prefix="DB_DEV")engine=ec.create_redshift()
如果您想从云安全地读取数据库凭据,例如aws ec2、aws lambda,可以使用aws kms来解密您的凭据
# leave aws_profile=None if you are on cloudec=EngineCreator.from_env(prefix="DB_DEV",kms_decrypt=True,aws_profile="xxx")engine=ec.create_redshift()
Smart Insert
在批量插入中,如果某些行有主键冲突,经典的解决方案是:
forrowindata:try:engine.execute(table.insert(),row)exceptsqlalchemy.sql.IntegrityError:pass
它就像是一个接一个的插入,非常慢。
sqlalchemy_mate使用smart_insert策略尝试较小的大容量插入,这样工作的可能性更高。结果,提交的总数大大减少。
使用SQL表达式:
fromsqlalchemy_mateimportinsertingengine=create_engine(...)t_users=Table("users",metadata,Column("id",Integer),...)# lots of datadata=[{"id":1,"name":"Alice}, {"id": 2, "name": "Bob"}, ...]# the magic functioninserting.smart_insert(engine,t_users,data)
使用ORM:
fromsqlalchemy_mateimportExtendedBaseBase=declarative_base()classUser(Base,ExtendedBase):# inherit from ExtendedBase...# lots of usersdata=[User(id=1,name="Alice"),User(id=2,name="Bob"),...]# the magic methodUser.smart_insert(engine_or_session,data)# That's it
Smart Update / Upsert
按主键自动更新值。
# in SQL expression#fromsqlalchemy_mateimportupdatingdata=[{"id":1,"name":"Alice}, {"id": 2, "name": "Bob"}, ...]updating.update_all(engine,table,data)updating.upsert_all(engine,table,data)# in ORM#data=[User(id=1,name="Alice"),User(id=2,name="Bob"),...]User.update_all(engine_or_session,user_list)User.upsert_all(engine_or_session,user_list)
安装
sqlalchemy_mate在pypi上发布,所以您只需要:
$ pip install sqlalchemy_mate
要升级到最新版本:
$ pip install --upgrade sqlalchemy_mate