{"id":34734,"date":"2019-10-31T22:00:06","date_gmt":"2019-10-31T19:00:06","guid":{"rendered":"https:\/\/prohoster.info\/blog\/sravnenie-i-vybor-sistem-migratsii-dannyh\/"},"modified":"2019-10-31T22:00:06","modified_gmt":"2019-10-31T19:00:06","slug":"sravnenie-i-vybor-sistem-migratsii-dannyh","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/sravnenie-i-vybor-sistem-migratsii-dannyh","title":{"rendered":"Comparison and selection of data migration systems","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h2>Comparison and selection of data migration systems<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Comparison and selection of data migration systems\" src=\"\/wp-content\/uploads\/2019\/05\/a25cc01b8d86b233a6d21caddb169fec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe data model in the development process is subject to change, and at some point, it may no longer align with the database. Of course, the database can be deleted, and then ORM will create a new version that corresponds to the model, but this procedure will lead to the loss of existing data. Therefore, the migration system's function is to synchronize the schema with the data model in the application due to changes without losing existing data.<\/p>\n<p>In this article, we would like to examine various tools for managing database migrations. We hope this overview will be useful for developers facing such choices.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Task<\/h3>\n<p>\nOur company is currently actively developing the next generation product \u2013 Docs Security Suite (DSS). The server side is being developed in .Net Core, and Entity Framework Core is used as the DBMS accordingly. We are applying the Code First approach in the application design.<\/p>\n<p>The domain model of the application is created by several developers simultaneously \u2013 each responsible for their logical part of the system. <\/p>\n<p>In the previous generation of DSS, the classic Entity Framework Migrations (EF 6) was used as the migration management system. However, some complaints have accumulated regarding it, the main one being that EF lacks a reasonable approach to resolving version conflicts. This fact still bothers us during bug fixing in the framework of support, so it was decided to consider alternative options.<\/p>\n<p>As a result of discussions, the following requirements for the migration management system were formed:<\/p>\n<ol>\n<li>Support for various DBMSs. MS SQL Server, PostgreSQL, and Oracle are mandatory, but potentially other systems may also be used.<\/li>\n<li>Integration with ORM. Initially, the use of EF Core was assumed; however, at the design stage, we were ready to consider other ORMs as well.<\/li>\n<li>Auto-generation of migrations. Given the Code First development, we would like to avoid the need to manually write migrations.<\/li>\n<li>Version conflicts. In a distributed development environment, EF Core may fail due to conflicts during merging. This becomes a significant problem since different parts of the application are created by different developers, requiring extensive time for each.<\/li>\n<li>Comprehensive documentation and support. Here, we believe, further explanations are unnecessary.<\/li>\n<li>Free of charge. This criterion is conditional, as we are also ready to consider not very expensive systems or expensive ones that excel in convenience.<\/li>\n<\/ol>\n<p>\nAs a result of a brief investigation, the following options were identified and deemed desirable for consideration:<\/p>\n<ol>\n<li>EF Core Migrations<\/li>\n<li>DBup<\/li>\n<li>RoundhousE<\/li>\n<li>ThinkingHome.Migrator<\/li>\n<li>Fluent Migrator <\/li>\n<\/ol>\n<p><\/p>\n<h3>Now, a bit more detail<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Comparison and selection of data migration systems\" src=\"\/wp-content\/uploads\/2019\/05\/4cb242f230b19073626e36a472dcea50.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/ef\/core\/managing-schemas\/migrations\/\">EntityFramework Core Migrations<\/a><\/noindex><\/b><\/p>\n<p>Naturally, this was the first and primary option to choose. A native tool that works out of the box without any extra hassle. A large amount of documentation, both official and unofficial, simplicity, etc. However, the issues raised regarding traditional EF are just as relevant for EF Core. <\/p>\n<p>Thus, the advantages of EF Core include:<\/p>\n<ul>\n<li>Microsoft support, documentation, including in Russian, a huge community<\/li>\n<li>Automatic migration generation based on CodeFirst<\/li>\n<li>Compared to EF 6, EF Core no longer stores a snapshot of the database. When working with EF Core in Code First, it is no longer necessary to deploy the database.<\/li>\n<li>Since we are starting from Code First, it is possible to maintain one migration for all required data access providers.<\/li>\n<li>Regarding providers\u2014both PostgreSQL and Oracle are supported, etc., and even\u2014MS SQL Server :)<\/li>\n<\/ul>\n<p>\n And here are the disadvantages:<\/p>\n<ul>\n<li>Conflict resolution remains at the same level. It is necessary to establish the sequence of migrations and update database snapshots.<\/li>\n<li>Dependence on the models based on which migrations are generated.<\/li>\n<\/ul>\n<p>\n<b>DbUp<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Comparison and selection of data migration systems\" src=\"\/wp-content\/uploads\/2019\/05\/02a47718c7b4c618c204c2273b4de50c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/dbup.github.io\/\">dbup.github.io<\/a><\/noindex><\/p>\n<p>DbUp is a .NET library that is installed via NuGet and helps apply changes to SQL Server. It tracks which change scripts have already been executed and runs those necessary for updating the database. The library grew out of an open-source blogging engine project based on ASP.NET and is available under the MIT license, with the code hosted on GitHub. Migrations are described using T-SQL.<\/p>\n<p>Here are some advantages:<\/p>\n<ul>\n<li>Support for a wide range of DBMS (MS SQL Server, PostgreSQL, MySQL)<\/li>\n<li>Since the scripts are written in T-SQL, they appear quite straightforward.<\/li>\n<li>Conflicts are also resolved using SQL.<\/li>\n<\/ul>\n<p>\nAnd the disadvantages:<\/p>\n<ul>\n<li>Despite the variety of supported DBMS, Oracle is not among them.<\/li>\n<li>Does not interact with ORM.<\/li>\n<li>Writing T-SQL scripts manually is not what we aimed for. <\/li>\n<li>The documentation and community are lackluster, though they may not be necessary for writing SQL scripts.<\/li>\n<\/ul>\n<p>\n<b>RoundhousE<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Comparison and selection of data migration systems\" src=\"\/wp-content\/uploads\/2019\/05\/ca418187d64e75830b2643dea794c6d0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/chucknorris\/roundhouse\">github.com\/chucknorris\/roundhouse<\/a><\/noindex><\/p>\n<p>This migration management tool, distributed under the Apache 2.0 license, like its predecessor, operates on the T-SQL migration engine. It seems that the developers prioritized solving technical problems related to database support rather than creating a comfortable development process.<\/p>\n<p>Pros:<\/p>\n<ul>\n<li>Supports necessary databases (including Oracle)<\/li>\n<\/ul>\n<p>\nCons:<\/p>\n<ul>\n<li>Oracle (as well as the outdated Access) is not supported on .NET Core, only on the .NET Full Framework.<\/li>\n<li>Does not work with ORM<\/li>\n<li>There is even less documentation than for the previous tool.<\/li>\n<li>Again, migrations are written with scripts.<\/li>\n<\/ul>\n<p>\n<b>ThinkingHome.Migrator<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Comparison and selection of data migration systems\" src=\"\/wp-content\/uploads\/2019\/05\/c530e23f8c9c27ed1d53f3dce710eb70.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA tool for versioned database schema migration for the .NET Core platform, distributed under the MIT license. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/414867\/\">The developer wrote about its latest version almost a year ago.<\/a><\/noindex>. <\/p>\n<p>Pros:<\/p>\n<ul>\n<li>Tailored for .NET Core<\/li>\n<li>Branching migration sequences are implemented.<\/li>\n<li>Migration logging is implemented.<\/li>\n<\/ul>\n<p>\nCons:<\/p>\n<ul>\n<li>The last update was a year ago. It appears the project is not maintained.<\/li>\n<li>Oracle is not supported (the article states this is due to the lack of a stable implementation for .NET Core \u2013 but that was a year ago).<\/li>\n<li>Auto-generation of migrations is absent.<\/li>\n<\/ul>\n<p>\nOverall, the project looks promising, especially if it were to evolve, but we needed to make a decision here and now.<\/p>\n<p><b>Fluent Migrator<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Comparison and selection of data migration systems\" src=\"\/wp-content\/uploads\/2019\/05\/def2f7b9ecd8084975add75ded1a7a71.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/fluentmigrator\/fluentmigrator\">github.com\/fluentmigrator\/fluentmigrator<\/a><\/noindex><\/p>\n<p>The most popular migration tool, with a large following. Distributed under the Apache 2.0 license. As stated in the description, it is a migration platform for .NET, analogous to Ruby on Rails Migrations. Database schema changes are described in classes in C#.<\/p>\n<p>There are advantages here:<\/p>\n<ul>\n<li>Support for necessary databases<\/li>\n<li>Support for .NET Core<\/li>\n<li>A large, developed community<\/li>\n<li>Migration conflicts are resolved sequentially \u2013 migrations indicate the execution order. Moreover, if a conflict arises around a single entity, conflict resolution during merging is handled just like the rest of the code.<\/li>\n<li>There are profiles that execute after successful migration. They can carry service functions. The last update was a month ago, which means the project is active.<\/li>\n<\/ul>\n<p>\nAs for the downsides, they include:<\/p>\n<ul>\n<li>Auto-generation of migrations is absent.<\/li>\n<li>No connection to EF models<\/li>\n<li>No database snapshots<\/li>\n<\/ul>\n<p><\/p>\n<h3>What was our choice?<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Comparison and selection of data migration systems\" src=\"\/wp-content\/uploads\/2019\/05\/db6953bf80bbbf9f560e39b32c32752c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe most heated debates revolved around two parameters \u2013 auto-generation of migrations and a reasonable conflict resolution solution. Other factors were far less intimidating. Ultimately, after discussions, the team decided to use Fluent Migrator for the new project. This is because conflict resolution in the longer term will bring a lot more benefits.<\/p>\n<h4>Conclusions<\/h4>\n<p>\nOf course, there are no perfect tools. We had to prioritize our 'wish list' for our selection. However, other factors might be crucial for different teams and tasks. We hope this article will help you make your choice.<br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/crosstech\/blog\/453930\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0431\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u0438 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0411\u0414 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u0438 \u0442\u043e\u0433\u0434\u0430 ORM \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438, \u043d\u043e \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26172,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34734","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0431\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 .\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/sravnenie-i-vybor-sistem-migratsii-dannyh\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0431\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0431\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 .\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/sravnenie-i-vybor-sistem-migratsii-dannyh\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:00:06+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:00:06+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Comparison and selection of data migration systems | ProHoster","description":"Comparison and selection of data migration systems.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/sravnenie-i-vybor-sistem-migratsii-dannyh","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0431\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 | ProHoster","og:description":"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0431\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 .","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/sravnenie-i-vybor-sistem-migratsii-dannyh","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:00:06+00:00","article:modified_time":"2019-10-31T19:00:06+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34734","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 20:26:53","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:16:32","updated":"2026-01-21 20:26:53","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/34734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=34734"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/34734\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/26172"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=34734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=34734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=34734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}