使用sqlalchemy从yaml创建数据库项的包。

bootalchem的Python项目详细描述


bootalchemy是一个工具,允许您通过yaml格式的文本将数据加载到sql数据库中。通过设置映射对象的
和一些文本,可以提供bootalchemy,它会将带有该文本的对象
推送到数据库中。除了yaml提供的所有功能之外,bootalchemy还可以消除关系的模糊,并将它们添加到数据库中。


/>从bootalchemy开始,我们首先考虑这个模型,假设它是在一个名为"model"的模块中定义的:




movie-directors-table=table('movie-directors',metadata,
column('movie-id',integer,foreignkey('movies.movie_id'),primary_key=true),
column('director_id',integer,foreignkey('directors.director_id'),primary_key=true))

=列(整数,主键=真)
名称=列(字符串(100))
说明=列(字符串(300))

nullable=false)
描述=列(文本,nullable=true)
流派id=column(整数,foreignkey('genres.general'id')
流派=关系('genre',backref='movies')
发布日期=列(日期,nullable=true)

):
u tablename_uuu="directors"
director_u id=column(integer,primary_u key=true)
title=column(string(100),nullable=false)
movies=relation(movie,secondary=movie_u directors表,backref="directors")

首先,让我们探讨一下用于将数据推送到数据库中的结构。我们将使用普通的python从bootalchemy加载数据:

。加载程序导入加载程序/>
loader=loader(model)
loader.from_list(session,data)


genres=session.query(genre.all()
print[(genre.name,genre.description)for genre in genres]


[("action","car chases,guns and暴力"。)]数据正在会话中,尚未提交到数据库。启动炼金术默认情况下不提交,但可以进行提交。


对象名:[objectname类型的对象的开始
{属性':'value',属性':'value'…更多属性},
{属性':'值','属性':'值'…更多属性},

}
]
objectname:[…这里有更多的属性指令…]
[提交:无]在此分组结束时可选提交
[刷新:无]在此分组结束时可选刷新
},第一个分组结束
{{下一个分组开始

}下一个分组结束
]

基本结构是字典列表。每个字典代表一组对象。
每个对象可以有一个或多个与之关联的记录。

tting
--------
如果为分组提供名为commit和flush的键,则会话将相应地被提交或刷新。需要注意的一点是,如果您在记录中定义了任何
关系,那么分组将在该点刷新。
无法避免这种刷新。

declarativebase会自动执行此操作,但如果您有标准的sqlalchemy对象
定义,则可能需要使用类似于以下内容的超类来扩充它们:

class dbobject(object):
"
这是所有其他模型的dbobject类类依赖于。
它允许我们通过将属性传递到构造函数中来实例化具有属性的对象。


"
def\uu in it(self,**kw):
对于item,值以kw.iteritems()表示:
setattr(self,item,value)

存储引用(想想autoincrement)
例如,让我们存储流派id,并在电影定义中使用它。::

data=[{'genre':[{'genre'id':'&scfi'id',
'name':"sci-fi",
'description':"科幻小说,请参见:42'
}
],
"刷新":无},
{"电影":[{"标题":"回到未来",
"描述":"1985年,布朗博士发明了时间旅行;1955年,马蒂·麦克弗利意外地阻止了他的父母。"开会,把自己的存在置于危险之中,
"发布日期":"1985-04-03",
"流派id":"*scfi id"},
"刷新":无=session.query(movie.all()
print[(movie.title,movie.genre.name)for movie in movies]


参考字典。然后,当您提供以"*"开头的字符串时,将检索
。引用是在
对象刷新到数据库之后设置的,这意味着如果有一个自动递增的
字段,它将被设置为递增的值。
请注意,电影对象中填充了类型。这更多的是
orm的影响,而不是引导炼金术的影响,但是我们接下来将看到引导炼金术本身如何利用orm的
内部工作。

关系
----
因为我们有一个对象映射到表,而不仅仅是数据库中的表,所以我们不能将实际对象分配给引用词典,而不仅仅是id。下面是另一种将类型分配给电影的方法:


data=[{genre':[{‘喜剧’:{‘名字’:‘喜剧’,
‘描述’:‘你不喜欢笑吗?’
}
],
"flush":none},
{movie':[{"description":"dude"lebowski,被误认为百万富翁lebowski,\
为他被毁坏的地毯寻求赔偿,并登记他的\
保龄球朋友们来帮你拿到它。',
"标题":"大勒保夫斯基",
"发行日期":"1998-03-06",
"流派":"*喜剧"},
"冲洗":无读取列表(会话,数据)
movies=session.query(movie).all()
print[(movie.title,movie.genre.name)用于电影中的电影]



如果您获得
对象的列表,bootalchemy将从参考字典中检索它们,并将它们附加到对象的适当属性。让我们为电影分配一些导演。:

data=[{director':[{'&andy':{'name':"andy wachowski"},
{'&larry':{'name':"larry wachowski"}
],
'flush':none},
{'movie':[{"description":"一个com电脑黑客从神秘的叛军那里学到了他真实的本质,以及他在对抗控制者的战争中所扮演的角色。"发布日期":"1999-03-31",
"导演":["*andy","*larry"],"流派id":"*scfi id"},
"刷新":无
}]


loader.from_list(session,data)
movies=session.query(movie).all()
打印[(movie.title,[d.电影中d的名称。导演])电影中d的名称]


o与yaml一起工作。您可以轻松地
提供一个yaml字符串来引导解析。yaml的好处是它是一个非python开发人员可以遵循的标准,并且除了可以使用字典中的简单字符串之外,它还有一系列功能。查看规范:http://www.yaml.org/spec/。这里有一个示例yaml字符串加载到数据库中,使用bootalchemy::


标题:搏击俱乐部,
发布日期:1999-10-14ads(session,data)
movies=session.query(movie.all()
print[(movie.title,movie.genre.name)for movie in movies]


我们还向这个加载程序提供了现有的引用,因为它没有以前运行时的引用。
作为一个python程序员,您可能会发现yaml非常令人耳目一新。它有简单的语法,奖励简洁,并且对缩进敏感。在许多方面,在python中设置数据要比python好,因为许多引号已经被消除。
pyyaml提供可读的调试输出,以防yaml语法不正确。下面是一个示例,其中一个离群的"}"已被
留在类型行的末尾::

-描述:一个office员工…
^
需要<;block end>;,但在"<;string>;"第6行第23列中找到了"}"
类型:"*action"}
^



:类:`yamlloader'还提供了一个loadf函数,该函数接受一个文件名并将其加载到数据库。

json!
----
yaml的一个优点是json是我的意思是我经常发现自己有一堆手工输入到数据库中的数据,我想复制这些数据用于某种开发过程。我可以使用浏览器将数据库数据输出到json中,然后将其作为
流注入到bootloader程序中。



索引和表
==

*:ref:`genindex`
*:ref:`modindex`
*:ref:`search`

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何使用java从xml文件中删除标记属性   HashMap的java自定义键   java ListView在目录中显示文件时出错   JavaSpring建议:代理机制与类或接口上的@Transactional   java我对th有问题:如果在春天   是否有任何API或网站可以对我的Java代码进行颜色编码并将其转换为html?   java从资产中的文本文件中读取两次,扫描仪不带缓冲读取器   java是否可以将RestHighLevelClient与假定角色一起使用?   java在java8流中下载文件的有效方法   具有多对一映射的java kafka流左连接   带循环的java灰度/渐变   用Java创建CAB文件   java取代了JTable的组合框编辑器   与Websocket的java连接   JavaSpringBootSecurity不会重定向对configure(httpsecurityhttp)方法的oauth/authorize调用   java Spring注入变量为null   java Restlet无法处理json   java中的函数未完成   用java实现带记录文件的排序