{"id":1258,"date":"2022-11-30T14:54:19","date_gmt":"2022-11-30T14:54:19","guid":{"rendered":"https:\/\/www.hammerdb.com\/blog\/?p=1258"},"modified":"2022-12-02T11:11:59","modified_gmt":"2022-12-02T11:11:59","slug":"hammerdb-v4-6-new-features-pt1-python-cli-interface","status":"publish","type":"post","link":"https:\/\/www.hammerdb.com\/blog\/uncategorized\/hammerdb-v4-6-new-features-pt1-python-cli-interface\/","title":{"rendered":"HammerDB v4.6 New Features Pt1: Python CLI Interface"},"content":{"rendered":"<p>From version v4.6 HammerDB allows you to run the Command Line Interface in both interactive and scripted sessions using a Python interpreter as an alternative to the default Tcl environment on both Linux and Windows.<\/p>\n<h3>Python Version Dependency<\/h3>\n<p>HammerDB will rely on the system installed Python interpreter and at a specific version as described in the following table. On Windows you need to install Python from www.python.org rather than the Windows app store to ensure that the required libraries are installed.<\/p>\n<table style=\"border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr>\n<td style=\"width: 50%;\">Linux<\/td>\n<td style=\"width: 50%;\">3.8<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%;\">Red Hat Enterprise Linux<\/td>\n<td style=\"width: 50%;\">3.6<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%;\">Windows<\/td>\n<td style=\"width: 50%;\">3.10<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>If you need a different version of Python you can build HammerDB from source as detailed in the documentation to use any version of Python 3 that you wish.<\/p>\n<h3>Starting the CLI in Python Mode<\/h3>\n<p>To start HammerDB in Python mode run the hammerdbcli tool with &#8220;py&#8221; or &#8220;python&#8221; as the first argument.\u00a0 HammerDB will show the prompt\u00a0 &#8220;hammerdb&gt;&gt;&gt;&#8221; to indicate that it is running a Python interpreter.<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">$ .\/hammerdbcli py\r\nHammerDB CLI v4.6 \r\nCopyright (C) 2003-2022 Steve Shaw \r\nType \"help()\" for a list of commands \r\nhammerdb&gt;&gt;&gt;<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<p>On Windows firstly open a CMD shell, navigate to HammerDB directory and run the same command as on Linux.<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">C:\\Program Files\\HammerDB-4.6&gt;hammerdbcli py \r\nHammerDB CLI v4.6 \r\nCopyright (C) 2003-2022 Steve Shaw \r\nType \"help()\" for a list of commands \r\nhammerdb&gt;&gt;&gt;<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<p>In this mode HammerDB will now accept commands and scripts in Python format enabling integration with an existing Python environment. A Python script can be run from an external command or script using the auto argument and a .py extension to the script.<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">hammerdbcli py auto autorunbuild.py<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<p>or the script run from the interactive prompt using the source command.<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">hammerdb&gt;&gt;&gt;source('cliexample.py')<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<p>The HammerDB commands are accessed as Python functions with all arguments given as strings or integers where appropriate.<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">print(\"SETTING CONFIGURATION\") \r\ndbset('db','mssqls') \r\ndiset('tpcc','mssqls_driver','timed') \r\ndiset('tpcc','mssqls_rampup',0) \r\ndiset('tpcc','mssqls_duration',1) \r\nvuset('logtotemp',1) \r\nloadscript() \r\nprint(\"SEQUENCE STARTED\") \r\nfor z in [1,2,4]: \u00a0\u00a0\u00a0 \r\n     print(z,\" VU TEST\") \u00a0\u00a0\u00a0 \r\n     vuset('vu',z) \u00a0\u00a0\u00a0 \r\n     vucreate() \u00a0\u00a0\u00a0 \r\n     vurun() \u00a0\u00a0\u00a0 \r\n     vudestroy() \r\n\r\nprint(\"TEST SEQUENCE COMPLETE\")<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<p>Running this script returns output as follows using the Python loop to drive HammerDB.<\/p>\n<pre>hammerdb&gt;&gt;&gt;source('cliexample.py')\r\nhammerdb&gt;&gt;&gt;SETTING CONFIGURATION\r\nDatabase set to MSSQLServer\r\nValue timed for tpcc:mssqls_driver is the same as existing value timed, no change made\r\nChanged tpcc:mssqls_rampup from 2 to 0 for MSSQLServer\r\nChanged tpcc:mssqls_duration from 5 to 1 for MSSQLServer\r\nScript loaded, Type \"print script\" to view\r\nSEQUENCE STARTED\r\n1 VU TEST\r\nVuser 1 created MONITOR - WAIT IDLE\r\nVuser 2 created - WAIT IDLE\r\nLogging activated\r\nto C:\/Users\/Hdb\/AppData\/Local\/Temp\/hammerdb.log\r\n2 Virtual Users Created with Monitor VU\r\nVuser 1:RUNNING\r\nVuser 1:Initializing xtprof time profiler\r\nVuser 1:Beginning rampup time of 0 minutes\r\nVuser 1:Rampup complete, Taking start Transaction Count.\r\nVuser 1:Timing test period of 1 in minutes\r\nVuser 2:RUNNING\r\nVuser 2:Initializing xtprof time profiler\r\nVuser 2:Processing 10000000 transactions with output suppressed...\r\nVuser 1:1 ...,\r\nVuser 1:Test complete, Taking end Transaction Count.\r\nVuser 1:1 Active Virtual Users configured\r\nVuser 1:TEST RESULT : System achieved 39945 NOPM from 92893 SQL Server TPM\r\nVuser 1:Gathering timing data from Active Virtual Users...\r\nVuser 2:FINISHED SUCCESS\r\nVuser 1:Calculating timings...\r\nVuser 1:Writing timing data to C:\/Users\/Hdb\/AppData\/Local\/Temp\/hdbxtprofile.log\r\nVuser 1:FINISHED SUCCESS\r\nALL VIRTUAL USERS COMPLETE\r\nvudestroy success\r\n2 VU TEST\r\nVuser 1 created MONITOR - WAIT IDLE\r\nVuser 2 created - WAIT IDLE\r\nVuser 3 created - WAIT IDLE\r\nLogging activated\r\nto C:\/Users\/Hdb\/AppData\/Local\/Temp\/hammerdb.log\r\n3 Virtual Users Created with Monitor VU\r\nVuser 1:RUNNING\r\nVuser 1:Initializing xtprof time profiler\r\nVuser 1:Beginning rampup time of 0 minutes\r\nVuser 1:Rampup complete, Taking start Transaction Count.\r\nVuser 1:Timing test period of 1 in minutes\r\nVuser 2:RUNNING\r\nVuser 2:Initializing xtprof time profiler\r\nVuser 2:Processing 10000000 transactions with output suppressed...\r\nVuser 3:RUNNING\r\nVuser 3:Initializing xtprof time profiler\r\nVuser 3:Processing 10000000 transactions with output suppressed...\r\nVuser 1:1 ...,\r\nVuser 1:Test complete, Taking end Transaction Count.\r\nVuser 1:2 Active Virtual Users configured\r\nVuser 1:TEST RESULT : System achieved 81178 NOPM from 189455 SQL Server TPM\r\nVuser 1:Gathering timing data from Active Virtual Users...\r\nVuser 3:FINISHED SUCCESS\r\nVuser 2:FINISHED SUCCESS\r\nVuser 1:Calculating timings...\r\nVuser 1:Writing timing data to C:\/Users\/Hdb\/AppData\/Local\/Temp\/hdbxtprofile.log\r\nVuser 1:FINISHED SUCCESS\r\nALL VIRTUAL USERS COMPLETE\r\nvudestroy success\r\n4 VU TEST\r\nVuser 1 created MONITOR - WAIT IDLE\r\nVuser 2 created - WAIT IDLE\r\nVuser 3 created - WAIT IDLE\r\nVuser 4 created - WAIT IDLE\r\nVuser 5 created - WAIT IDLE\r\nLogging activated\r\nto C:\/Users\/Hdb\/AppData\/Local\/Temp\/hammerdb.log\r\n5 Virtual Users Created with Monitor VU\r\nVuser 1:RUNNING\r\nVuser 1:Initializing xtprof time profiler\r\nVuser 1:Beginning rampup time of 0 minutes\r\nVuser 1:Rampup complete, Taking start Transaction Count.\r\nVuser 1:Timing test period of 1 in minutes\r\nVuser 2:RUNNING\r\nVuser 2:Initializing xtprof time profiler\r\nVuser 2:Processing 10000000 transactions with output suppressed...\r\nVuser 3:RUNNING\r\nVuser 3:Initializing xtprof time profiler\r\nVuser 3:Processing 10000000 transactions with output suppressed...\r\nVuser 4:RUNNING\r\nVuser 4:Initializing xtprof time profiler\r\nVuser 4:Processing 10000000 transactions with output suppressed...\r\nVuser 5:RUNNING\r\nVuser 5:Initializing xtprof time profiler\r\nVuser 5:Processing 10000000 transactions with output suppressed...\r\nVuser 1:1 ...,\r\nVuser 1:Test complete, Taking end Transaction Count.\r\nVuser 1:4 Active Virtual Users configured\r\nVuser 1:TEST RESULT : System achieved 118762 NOPM from 276763 SQL Server TPM\r\nVuser 1:Gathering timing data from Active Virtual Users...\r\nVuser 5:FINISHED SUCCESS\r\nVuser 4:FINISHED SUCCESS\r\nVuser 3:FINISHED SUCCESS\r\nVuser 2:FINISHED SUCCESS\r\nVuser 1:Calculating timings...\r\nVuser 1:Writing timing data to C:\/Users\/Hdb\/AppData\/Local\/Temp\/hdbxtprofile.log\r\nVuser 1:FINISHED SUCCESS\r\nALL VIRTUAL USERS COMPLETE\r\nvudestroy success\r\nTEST SEQUENCE COMPLETE\r\nhammerdb&gt;&gt;&gt;<\/pre>\n<h3>Python Performance and the GIL<\/h3>\n<p>You should already be aware that due to the Python GIL impacting multithreading performance it is not possible to drive a high-performance database workload directly from Python.<\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"WEd8Czog8R\"><p><a href=\"https:\/\/www.hammerdb.com\/blog\/uncategorized\/why-tcl-is-700-faster-than-python-for-database-benchmarking\/\">Why Tcl is 700% faster than Python for database benchmarking<\/a><\/p><\/blockquote>\n<p><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Why Tcl is 700% faster than Python for database benchmarking&#8221; &#8212; HammerDB Blog\" src=\"https:\/\/www.hammerdb.com\/blog\/uncategorized\/why-tcl-is-700-faster-than-python-for-database-benchmarking\/embed\/#?secret=XLSkiG63yb#?secret=WEd8Czog8R\" data-secret=\"WEd8Czog8R\" width=\"525\" height=\"296\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<p>Therefore, although on both Linux and Windows, you will see Python as the top process in performance monitoring tools when running the workload.<\/p>\n<p><a href=\"https:\/\/www.hammerdb.com\/blog\/wp-content\/uploads\/2022\/11\/pyprocess.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1262\" src=\"https:\/\/www.hammerdb.com\/blog\/wp-content\/uploads\/2022\/11\/pyprocess.png\" alt=\"\" width=\"347\" height=\"116\" srcset=\"https:\/\/www.hammerdb.com\/blog\/wp-content\/uploads\/2022\/11\/pyprocess.png 347w, https:\/\/www.hammerdb.com\/blog\/wp-content\/uploads\/2022\/11\/pyprocess-300x100.png 300w\" sizes=\"auto, (max-width: 347px) 100vw, 347px\" \/><\/a><\/p>\n<p>The multithreading capabilities of Tcl are embedded into Python ensuring that the same high levels of performance can be achieved as when running directly in Tcl.<\/p>\n<h3>How the Python CLI Interface works<\/h3>\n<p>The HammerDB CLI interface uses a package called tclpy to embed HammerDB into the Python interpreter.\u00a0 Therefore, advanced users can also use the command tclpy.eval to call HammerDB commands directly and\u00a0 tclpy.eval(&#8216;vurun&#8217;) is functionally equivalent to vurun() but will return output values and therefore in the example below this is how vurun can be called in v4.6 to capture the jobid.<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">print(\"SETTING CONFIGURATION\")\r\ndbset('db','maria')\r\ndbset('bm','TPC-C')\r\n\r\ndiset('connection','maria_host','localhost')\r\ndiset('connection','maria_port','3306')\r\ndiset('connection','maria_socket','\/tmp\/mariadb.sock')\r\n\r\ndiset('tpcc','maria_user','root')\r\ndiset('tpcc','maria_pass','maria')\r\ndiset('tpcc','maria_dbase','tpcc')\r\ndiset('tpcc','maria_driver','timed')\r\ndiset('tpcc','maria_rampup','2')\r\ndiset('tpcc','maria_duration','5')\r\ndiset('tpcc','maria_allwarehouse','true')\r\ndiset('tpcc','maria_timeprofile','true')\r\n\r\nloadscript()\r\nprint(\"TEST STARTED\")\r\nvuset('vu','vcpu')\r\nvucreate()\r\ntcstart()\r\ntcstatus()\r\njobid = tclpy.eval('vurun')\r\nvudestroy()\r\ntcstop()\r\nprint(\"TEST COMPLETE\")\r\nfd = open(\"maria_tprocc.out\", \"w\")\r\nfd.write(jobid)\r\nfd.close()\r\nexit()<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<p>Similarly, as we are running an embedded interpreter any redirection of stdout to capture should be passed to the embedded Tcl level and not at the Python level. See the Python Docker script examples for how this is done.<\/p>\n<h3>Calling Python from Tcl<\/h3>\n<p>Although the examples in this post show HammerDB being called from a Python interpreter it is also possible to load the same package into HammerDB being run with a Tcl interpreter and call Python functions with the &#8220;py eval&#8221; command, for example:<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">HammerDB CLI v4.6\r\nCopyright (C) 2003-2022 Steve Shaw\r\nType \"help\" for a list of commands\r\nInitialized SQLite on-disk database \/tmp\/hammer.DB using existing tables (36,864 KB)\r\nhammerdb&gt;package require tclpy\r\n0.4\r\n\r\nhammerdb&gt;py eval {divide = lambda x: 1.0\/int(x)}\r\n\r\nhammerdb&gt;set d [py call divide 16]\r\n0.0625\r\n<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<h3>Summary<\/h3>\n<p>From HammerDB v4.6, Python users can run the HammerDB CLI in interactive or scripted mode using a Python interpreter, yet still take advantage of the advanced high performance mulithreading of Tcl. This way HammerDB can extended to take advantage of the features of both languages.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>From version v4.6 HammerDB allows you to run the Command Line Interface in both interactive and scripted sessions using a Python interpreter as an alternative to the default Tcl environment on both Linux and Windows. Python Version Dependency HammerDB will rely on the system installed Python interpreter and at a specific version as described in &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.hammerdb.com\/blog\/uncategorized\/hammerdb-v4-6-new-features-pt1-python-cli-interface\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;HammerDB v4.6 New Features Pt1: Python CLI Interface&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"ppma_author":[5],"class_list":["post-1258","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"authors":[{"term_id":5,"user_id":2,"is_guest":0,"slug":"hammerdb","display_name":"HammerDB","avatar_url":{"url":"https:\/\/www.hammerdb.com\/blog\/wp-content\/uploads\/2018\/10\/logo-white.png","url2x":"https:\/\/www.hammerdb.com\/blog\/wp-content\/uploads\/2018\/10\/logo-white.png"},"author_category":"","user_url":"http:\/\/www.hammerdb.com","last_name":"","first_name":"","job_title":"","description":""}],"_links":{"self":[{"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/posts\/1258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/comments?post=1258"}],"version-history":[{"count":15,"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/posts\/1258\/revisions"}],"predecessor-version":[{"id":1274,"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/posts\/1258\/revisions\/1274"}],"wp:attachment":[{"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/media?parent=1258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/categories?post=1258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/tags?post=1258"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.hammerdb.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}