为SQLAlchemy加载YAML数据固定值
项目描述
为SQLAlchemy加载YAML数据固定值
此包允许您在YAML中定义一些数据并将其加载到数据库中。yaml数据应与SQLAlchemy声明性映射器相对应。
示例
- User:
- __key__: joey
username: joey
email: joey@example.com
profile:
name: Jeffrey
- __key__: dee
username: deedee
email: deedee@example.com
- Profile:
- user: dee
name: Douglas
- Group:
- name: Ramones
members: [joey.profile, dee.profile]
YAML的根包含一个映射器名称的序列,例如- User,- Profile等
这些名称的顺序应遵循关系依赖关系
每个名称应包含一个实例的序列
每个实例都是一个属性->值的映射
属性来自映射器 __init__()(通常一个属性映射到一个列)
特殊字段 __key__ 可以用于在关系引用中标识此实例,例如 Profile.user
注意,任何 __key__ 必须是全局 唯一
在一对一关系(to-one)中,数据可以直接嵌套在父数据定义中
引用可以使用 点 表示法访问属性,例如 joey.profile
可以将 多对多 关系添加为引用列表
此示例的映射器定义在 测试文件 中。
安装
pip install sqla-yaml-fixtures
API
此模块公开一个单一函数 load(ModelBase, session, fixture_text, loader=None)
其中
ModelBase 是 SQLAlchemy 声明式基类
session 是 SQLAlchemy 会话
fixture_text 是包含 YAML 固件的字符串
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session
import sqla_yaml_fixtures
BaseModel = declarative_base()
class User(BaseModel):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
username = Column(String(150), nullable=False, unique=True)
email = Column(String(254), unique=True)
def main():
engine = create_engine('sqlite://')
BaseModel.metadata.create_all(engine)
connection = engine.connect()
session = Session(bind=connection)
fixture = """
- User:
- username: deedee
email: deedee@example.com
- username: joey
email: joey@example.commit
"""
sqla_yaml_fixtures.load(BaseModel, session, fixture)
print('\n'.join(u.username for u in session.query(User).all()))
if __name__ == '__main__':
main()
注意:load() 函数执行 session.commit()。
load() 返回 Store 的实例。使用此对象
store = sqla_yaml_fixtures.load(BaseModel, session, fixture)
my_obj = store.get('dee')
print('Created object id: {}'.format(my_obj.id))
命令行
对于基本用法,还有命令行。示例
$ python -m sqla_yaml_fixtures --db-url sqlite:///dev.db --db-base mypkg.models:Base --reset-db --alembic-stamp fixture.yaml
所有可用选项
$ python -m sqla_yaml_fixtures --help usage: sqla_yaml_fixtures [-h] --db-base DB_BASE --db-url DB_URL [--yes] [--reset-db] [--alembic-stamp] [--jinja2] FILE [FILE ...] load fixtures from yaml file into DB positional arguments: FILE YAML file with DB fixtures optional arguments: -h, --help show this help message and exit --db-base DB_BASE SQLAlchemy Base class with schema metadata in the format my_package.my_module:MyClass --db-url DB_URL Database URL in the format dialect+driver://username:password@host:port/database --yes Do NOT ask for confirmation before applying fixtures --reset-db Drop DB schema and data and re-create schema before loading fixtures --alembic-stamp Perform `alembic stamp head` --jinja2 load fixture files as jinja2 templates