{"id":29398,"date":"2023-01-23T11:16:27","date_gmt":"2023-01-23T19:16:27","guid":{"rendered":"https:\/\/coderpad.io\/?p=29398"},"modified":"2023-06-07T13:38:40","modified_gmt":"2023-06-07T20:38:40","slug":"how-to-manipulate-sql-data-using-sqlalchemy-and-pandas","status":"publish","type":"post","link":"https:\/\/coderpad.io\/blog\/development\/how-to-manipulate-sql-data-using-sqlalchemy-and-pandas\/","title":{"rendered":"How To Manipulate SQL Data Using SQLAlchemy and Pandas"},"content":{"rendered":"\n<p>Dealing with databases through Python is easily achieved using <a href=\"https:\/\/www.sqlalchemy.org\/\" target=\"_blank\" rel=\"noopener\">SQLAlchemy<\/a>. Manipulating data through SQLAlchemy can be accomplished in most tasks, but there are some cases you need to integrate your database solution with the <a href=\"https:\/\/pandas.pydata.org\/\" target=\"_blank\" rel=\"noopener\">Pandas<\/a> library.<\/p>\n\n\n\n<p>This is useful, especially if you&#8217;re comfortable manipulating data through Pandas. There are also cases when you have a large CSV file, and you want to import the contained data into your SQLAlchemy. You can also use Pandas with SQLAlchemy when you already have a <a href=\"https:\/\/pandas.pydata.org\/docs\/reference\/api\/pandas.DataFrame.html\" target=\"_blank\" rel=\"noreferrer noopener\">DataFrame<\/a> that you want to import to your database instead of manual SQL inserts.<\/p>\n\n\n\n<p>In this tutorial, you&#8217;ll learn how to import data from SQLAlchemy to a Pandas data frame, how to export Pandas data frame to SQLAlchemy, and how to load a CSV file into a database.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Database setup with SQLAlchemy ORM<\/strong><\/h2>\n\n\n\n<p>The following snippet contains a database setup that we will use in this tutorial:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-wrap-lines\"><span class=\"hljs-keyword\">from<\/span> sqlalchemy <span class=\"hljs-keyword\">import<\/span> create_engine, Column, Integer, String, DateTime, Text, ForeignKey\n<span class=\"hljs-keyword\">from<\/span> sqlalchemy.engine <span class=\"hljs-keyword\">import<\/span> URL\n<span class=\"hljs-keyword\">from<\/span> sqlalchemy.orm <span class=\"hljs-keyword\">import<\/span> declarative_base, sessionmaker\n<span class=\"hljs-keyword\">from<\/span> datetime <span class=\"hljs-keyword\">import<\/span> datetime\n<span class=\"hljs-keyword\">import<\/span> pandas <span class=\"hljs-keyword\">as<\/span> pd\n\n\nBase = declarative_base()\n\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Article<\/span><span class=\"hljs-params\">(Base)<\/span>:<\/span>\n    __tablename__ = <span class=\"hljs-string\">'articles'<\/span>\n\n    id = Column(Integer(), primary_key=<span class=\"hljs-literal\">True<\/span>)\n    slug = Column(String(<span class=\"hljs-number\">100<\/span>), nullable=<span class=\"hljs-literal\">False<\/span>, unique=<span class=\"hljs-literal\">True<\/span>)\n    title = Column(String(<span class=\"hljs-number\">100<\/span>), nullable=<span class=\"hljs-literal\">False<\/span>)\n    created_on = Column(DateTime(), default=datetime.now)\n    updated_on = Column(DateTime(), default=datetime.now, onupdate=datetime.now)\n    content = Column(Text)\n\nurl = URL.create(\n    drivername=<span class=\"hljs-string\">\"postgresql\"<\/span>,\n    username=<span class=\"hljs-string\">\"coderpad\"<\/span>,\n    host=<span class=\"hljs-string\">\"\/tmp\/postgresql\/socket\"<\/span>,\n    database=<span class=\"hljs-string\">\"coderpad\"<\/span>\n    )\n\nengine = create_engine(url)\nSession = sessionmaker(bind=engine)\nsession = Session()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote\">\n<p>\u2139\ufe0f If you want to know the details of this setup and what every line entails, you can consult the previous <a href=\"https:\/\/coderpad.io\/blog\/development\/sqlalchemy-with-postgresql\/\">SQLAlchemy with PostgreSQL tutorial<\/a> that we discussed in detail.<\/p>\n<\/blockquote>\n\n\n\n<p>Now, the session object is ready to be used to interact with the database. You can insert a new article and commit that change to the PostgreSQL engine:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-wrap-lines\">article1 = Article(\n    slug=<span class=\"hljs-string\">\"clean-python\"<\/span>,\n    title=<span class=\"hljs-string\">\"How to Write Clean Python\"<\/span>,\n    content=<span class=\"hljs-string\">\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\"<\/span>\n    )\n\nBase.metadata.create_all(engine)\n\nsession.add(article1)\nsession.commit()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Here, we add the article object that has the title &#8220;How to Write Clean Python&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How to import data from SQLAlchemy to Pandas DataFrame<\/strong><\/h2>\n\n\n\n<p>We want the article we inserted into our database to be imported to a Pandas data frame. To do that, we need to use the <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.read_sql.html\" target=\"_blank\" rel=\"noopener\">read_sql()<\/a> Pandas method:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-wrap-lines\">first_article_query = session.query(Article).filter(Article.id == <span class=\"hljs-number\">1<\/span>)\nfirst_article_df = pd.read_sql(\n    sql=first_article_query.statement,\n    con=engine\n)\n\nprint(first_article_df&#91;<span class=\"hljs-string\">'title'<\/span>])<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>So here, the <code>first_article_query<\/code> is a <em>query <\/em>object from SQLAlchemy retrieving the article with an <code>id<\/code> of <code>1<\/code>. We then pass this object to the <code>read_sql<\/code> method with the statement method applied to it. This statement method retrieves the SQLAlchemy <em>selectable <\/em>object that we need for the SQL parameter in the <code>read_sql<\/code> method.<\/p>\n\n\n\n<p>We then pass the <em>engine <\/em>object to the <code>con<\/code> parameter of that method. Finally, we have our new Pandas data frame: <code>first_article_df<\/code>.<\/p>\n\n\n\n<p>If you print the title, you&#8217;ll get the expected result:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\">&gt;&gt;&gt; <span class=\"hljs-selector-tag\">first_article_df<\/span><span class=\"hljs-selector-attr\">&#91;<span class=\"hljs-string\">'title'<\/span>]<\/span>\n0    <span class=\"hljs-selector-tag\">How<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">Write<\/span> <span class=\"hljs-selector-tag\">Clean<\/span> <span class=\"hljs-selector-tag\">Python<\/span>\n<span class=\"hljs-selector-tag\">Name<\/span>: <span class=\"hljs-selector-tag\">title<\/span>, <span class=\"hljs-selector-tag\">dtype<\/span>: <span class=\"hljs-selector-tag\">object<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote\">\n<p>\u2139\ufe0f This <code>read_sql<\/code> method <em>only<\/em> reads SQL queries. It does not write data in the database. For example, if you want to change the title of that article:<\/p>\n<\/blockquote>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-wrap-lines\">first_article_df&#91;<span class=\"hljs-string\">'title'<\/span>] = <span class=\"hljs-string\">'Cleaner Python'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You&#8217;ll only see that this value is changed in the data frame:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\">&gt;&gt;&gt; <span class=\"hljs-selector-tag\">first_article_df<\/span><span class=\"hljs-selector-attr\">&#91;<span class=\"hljs-string\">'title'<\/span>]<\/span>\n0    <span class=\"hljs-selector-tag\">Cleaner<\/span> <span class=\"hljs-selector-tag\">Python<\/span>\n<span class=\"hljs-selector-tag\">Name<\/span>: <span class=\"hljs-selector-tag\">title<\/span>, <span class=\"hljs-selector-tag\">dtype<\/span>: <span class=\"hljs-selector-tag\">object<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Not in the database:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">&gt;&gt;&gt; session.query(Article).filter(Article.id == <span class=\"hljs-number\">1<\/span>).first().title\nu<span class=\"hljs-string\">'How to Write Clean Python'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\"><strong>How to export Pandas DataFrame to SQLAlchemy<\/strong><\/h2>\n\n\n\n<p>If you want to change the database through a <code>DataFrame<\/code>, you can use the <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.to_sql.html\" target=\"_blank\" rel=\"noopener\">to_sql()<\/a> Pandas method. This method can write records stored in a <code>DataFrame<\/code> to a SQL database.<\/p>\n\n\n\n<p>So here is a sample data frame that contains a new article:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-wrap-lines\">new_article_df = pd.DataFrame(\n    {\n        <span class=\"hljs-string\">'slug'<\/span>: &#91;<span class=\"hljs-string\">'sqlalchemy-pandas'<\/span>],\n        <span class=\"hljs-string\">'title'<\/span>: &#91;<span class=\"hljs-string\">'SQLAlchemy Pandas Article'<\/span>],\n        <span class=\"hljs-string\">'content'<\/span>: &#91;<span class=\"hljs-string\">'Bla bla bla'<\/span>],\n    })<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you want to insert this new article into the database, you need to use the <code>to_sql()<\/code> method as follows:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-wrap-lines\">new_article_df.to_sql(\n    name=<span class=\"hljs-string\">'articles'<\/span>,\n    con=engine,\n    if_exists=<span class=\"hljs-string\">'append'<\/span>,\n    index=<span class=\"hljs-literal\">False<\/span>,\n)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Here, we pass the table name to the <em>name <\/em>argument and the <em>engine <\/em>object to the <code>con<\/code> argument.<\/p>\n\n\n\n<p>We also specify the <code>append<\/code> option to the <code>if_exists<\/code> parameter to indicate that the table already exists and that we want to append that new article to the <code>articles<\/code> table. If you leave this parameter blank, it will automatically fail because the <code>if_exists<\/code> param is by default set to &#8220;fail&#8221;, and the articles table exists. However, if you set it to &#8220;replace&#8221;, the <code>articles<\/code> table will be dropped before inserting that new article.<\/p>\n\n\n\n<p>You can make sure this article is already committed to the database by the following query statement:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-wrap-lines\">session.query(Article).filter(\n    Article.slug==<span class=\"hljs-string\">'sqlalchemy-pandas'<\/span>\n).first().title<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">&gt;&gt;&gt; session.query(Article).filter(Article.slug == <span class=\"hljs-string\">'sqlalchemy-pandas'<\/span>).first().title\nu<span class=\"hljs-string\">'SQLAlchemy Pandas Article'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\"><strong>How to load a CSV file into a database<\/strong><\/h2>\n\n\n\n<p>In some cases, you may have a large CSV file that you want to import into the database. Instead of having a data entry clerk who can insert each record one by one, you can grab all data in that file and insert it into the database.<\/p>\n\n\n\n<p>You can do so by loading the CSV file to a data frame:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-wrap-lines\">new_df = pd.read_csv(<span class=\"hljs-string\">\"more_articles.csv\"<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>And then use the same <code>to_sql()<\/code> method to insert these records:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">new_df.to_sql(\n    name=<span class=\"hljs-string\">'articles'<\/span>,\n    con=engine,\n    if_exists=<span class=\"hljs-string\">'append'<\/span>,\n    index=<span class=\"hljs-keyword\">False<\/span>,\n)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>That way, you have inserted new articles into your database. Just make sure that the column names exactly match the name of your columns. If this is not the case, you may use the <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.rename.html\" target=\"_blank\" rel=\"noopener\"><code>rename()<\/code><\/a> Pandas method on your data frame.<\/p>\n\n\n\n<p>Try manipulating the SQL data in the sandbox below:<\/p>\n\n\n<div\n\tclass=\"sandbox-embed responsive-embed  sandbox-embed--full-width\"\n\tstyle=\"padding-top: 85%\"\ndata-block-name=\"coderpad-sandbox-embed\">\n\t<iframe src=\"https:\/\/embed.coderpad.io\/sandbox?question_id=239834&#038;use_question_button\" width=\"640\" height=\"544\" loading=\"lazy\" aria-label=\"Try out the CoderPad sandbox\"><\/iframe>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p>This tutorial has covered how to interact with SQLAlchemy and Pandas libraries to manipulate data. We discussed how to import data from SQLAlchemy to Pandas <code>DataFrame<\/code> using <code>read_sql<\/code>, how to export Pandas <code>DataFrame<\/code> to the database using <code>to_sql<\/code>, and how to load a CSV file to get a <code>DataFrame<\/code> that can be shipped to the database.<\/p>\n\n\n\n<p><em>I\u2019m Ezz. I\u2019m an AWS Certified Machine Learning Specialist and a Data Platform Engineer. I help SaaS companies rank on Google. Check out my&nbsp;<a href=\"https:\/\/ezzeddinabdullah.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">website<\/a>&nbsp;for more.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dealing with databases through Python is easily achieved using SQLAlchemy. Manipulating data through SQLAlchemy can be accomplished in most tasks, but there are some cases you need to integrate your database solution with the Pandas library. In this blog post, you&#8217;ll learn how to manipulate SQL data using SQLAlchemy and Pandas.<\/p>\n","protected":false},"author":1,"featured_media":29431,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[9],"tags":[],"persona":[29],"blog-programming-language":[66,67],"keyword-cluster":[],"class_list":["post-29398","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development"],"acf":[],"_links":{"self":[{"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/posts\/29398","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/comments?post=29398"}],"version-history":[{"count":37,"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/posts\/29398\/revisions"}],"predecessor-version":[{"id":34553,"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/posts\/29398\/revisions\/34553"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/media\/29431"}],"wp:attachment":[{"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/media?parent=29398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/categories?post=29398"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/tags?post=29398"},{"taxonomy":"persona","embeddable":true,"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/persona?post=29398"},{"taxonomy":"blog-programming-language","embeddable":true,"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/blog-programming-language?post=29398"},{"taxonomy":"keyword-cluster","embeddable":true,"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/keyword-cluster?post=29398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}