{"id":14763,"date":"2020-09-30T17:56:04","date_gmt":"2020-09-30T15:56:04","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/"},"modified":"2020-09-30T17:56:04","modified_gmt":"2020-09-30T15:56:04","slug":"oracle-adb-jupyter","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/","title":{"rendered":"Oracle ADB from a Jupyter Notebook"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nMy first attempt to connect to an Oracle database from a Jupyter Notebook on Google Colab was about one year ago:<br \/>\n<a href=\"https:\/\/medium.com\/@FranckPachot\/a-jupyter-notebook-on-google-collab-to-connect-to-the-oracle-cloud-atp-5e88b12282b0\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/medium.com\/@FranckPachot\/a-jupyter-notebook-on-google-collab-to-connect-to-the-oracle-cloud-atp-5e88b12282b0<\/a><\/p>\n<p>I&#8217;m currently preparing a notebook as a handout from my coming SQL101 presentation where I start with some NoSQL to discover the benefits of RDBMS and SQL. I&#8217;m running everything on the Oracle Database because it provides all APIs (NoSQL-like key-value, with SODA, documents with OSON, and of course SQL on relational tables) within the same converged database. The notebook will connect to my Autonomous Database in the Oracle Free Tier so that readers don&#8217;t have to create a database themselves to start with it. And the notebook runs on Google Colab which is a free environment where people (with a Gmail account) can run it and change the queries as they want to try new things.<\/p>\n<p>The notebook is there at <a href=\"http:\/\/sql101.pachot.net\" target=\"_blank\" rel=\"noopener noreferrer\">sql101.pachot.net<\/a>, but as I said, I&#8217;m currently working on it&#8230;<\/p>\n<p>In this post, I&#8217;m sharing a few tips about how I install and run connections from SQLcl, sqlplus and cx_Oracle. There are probably many improvements possible and that&#8217;s one reason I share it in this blog&#8230; Feedback welcome!<\/p>\n<p>Google Colab backend runs Ubuntu 18.04 and in order to tun the Oracle Client I need to install libaio:<\/p>\n<pre><code>\ndpkg -l | grep libaio1 &gt; \/dev\/null || apt-get install -y libaio1\n<\/code><\/pre>\n<p>I test the existence before calling apt-get because I don&#8217;t want a &#8220;Run all&#8221; to take too much time.<\/p>\n<p>Then I download the Instant Client, and SQLcl, and the cloud credential wallet to connect to my database which I&#8217;ve put on a public bucket in my free tier Object Store:<\/p>\n<pre><code>\n[ -f instantclient\/network\/admin\/sqlnet.ora ] || wget --continue --quiet https:\/\/objectstorage.us-ashburn-1.oraclecloud.com\/n\/idhoprxq7wun\/b\/pub\/o\/sql101.zip &amp;&amp; unzip -oq sql101.zip &amp;&amp; sed -e \"1a export TNS_ADMIN=$PWD\/instantclient\/network\/admin\" -e \"\/^bootStrap\/s\/$\/| cat -s\/\" -i sqlcl\/bin\/sql \n<\/code><\/pre>\n<p>I test the existence with the presence of one file (sqlnet.ora)<br \/>\nI hardcode the TNS_ADMIN in the SQLcl script<br \/>\nThe -e &#8220;\/^bootStrap\/s\/$\/| cat -s\/&#8221; is a dirty workaround for the black likes bug in SQLcl 20.2 (I&#8217;ll remove it when 20.3 is out)<br \/>\nAll this is quick and dirty, I admit&#8230; I have my presentation to prepare \ud83d\ude09<\/p>\n<p>I&#8217;ve build the wallet with passwords as I mentioned in a <a href=\"https:\/\/medium.com\/@FranckPachot\/generate-your-oracle-secure-external-password-store-wallet-from-your-tnsnames-ora-2fa7ff16803b\" target=\"_blank\" rel=\"noopener noreferrer\">previous post<\/a><\/p>\n<p>You also check this notebook I published a few weeks ago if you want to see how to install the instant client yourself:<\/p>\n<blockquote class=\"twitter-tweet\" data-width=\"500\" data-dnt=\"true\">\n<p lang=\"en\" dir=\"ltr\">Too lazy to open a free Autonomous Database? I let you play on mine from a <a href=\"https:\/\/twitter.com\/ProjectJupyter?ref_src=twsrc%5Etfw\">@ProjectJupyter<\/a> notebook on <a href=\"https:\/\/twitter.com\/GoogleColab?ref_src=twsrc%5Etfw\">@GoogleColab<\/a>. You just need a Google account to run it and connect to my ATP to play with SQL and NoSQL (SODA)<\/p>\n<p>\ud83d\ude0eplease be smart, don&#39;t break it \ud83d\ude4f<a href=\"https:\/\/t.co\/tprVZCOlws\">https:\/\/t.co\/tprVZCOlws<\/a> <a href=\"https:\/\/t.co\/IAERboN4oU\">pic.twitter.com\/IAERboN4oU<\/a><\/p>\n<p>&mdash; Franck Pachot (@FranckPachot) <a href=\"https:\/\/twitter.com\/FranckPachot\/status\/1295104246648582146?ref_src=twsrc%5Etfw\">August 16, 2020<\/a><\/p><\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n<p>Then I call a CREATE_USER procedure I have created in my database. The idea is that a public user is accessible (the password in the wallet) with minimal privileges just to run this procedure that creates a unique user for the Colab session.<\/p>\n<p>The most important is where I define a the Python magics to run SQLcl and sqlplus:<\/p>\n<pre><code>\nimport socket\nfrom IPython.core.magic import register_line_cell_magic\n@register_line_cell_magic\ndef sqlcl(line,cell=None):\n    if cell is None:\n      get_ipython().run_cell_magic('script', 'sqlcl\/bin\/sql -s -L \\'\"SQL101#'+socket.gethostname().upper()+'\"\/\"SQL101#'+socket.gethostname()[::-1]+'\"\\'@sql101_tp',line)    \n    else:\n      get_ipython().run_cell_magic('script', 'sqlcl\/bin\/sql -s -L \\'\"SQL101#'+socket.gethostname().upper()+'\"\/\"SQL101#'+socket.gethostname()[::-1]+'\"\\'@sql101_tp',cell)\n# register %sqlplus and %%sqlplus for easy run scripts\n@register_line_cell_magic\ndef sqlplus(line,cell=None):\n    if cell is None:\n      get_ipython().run_cell_magic('script', '\/content\/instantclient\/sqlplus -s -L \\'\"SQL101#'+socket.gethostname().upper()+'\"\/\"SQL101#'+socket.gethostname()[::-1]+'\"\\'@sql101_tp',line)    \n    else:\n      get_ipython().run_cell_magic('script', '\/content\/instantclient\/sqlplus -s -L \\'\"SQL101#'+socket.gethostname().upper()+'\"\/\"SQL101#'+socket.gethostname()[::-1]+'\"\\'@sql101_tp',cell)\n<\/code><\/pre>\n<p>The %sqlcl will call SQLcl in silent mode with the line (for %sqlcl) or cell (for %sqlcl)<br \/>\nThe %sqlplus is similar. The only advantage over SQLcl is that it is faster to start.<br \/>\nBoth have the connection string hardcoded in the same way as I generated the user and password (the username from the host name, the password as well).<\/p>\n<p>Then I install the Oracle driver for Python:<\/p>\n<pre><code>\npip install cx_Oracle\n<\/code><\/pre>\n<p>With it I can run SQL queries from Python or even SQLAlchemy.<\/p>\n<p>I also load the SQL magic from <a href=\"https:\/\/github.com\/catherinedevlin\" target=\"_blank\" rel=\"noopener noreferrer\">Catherine Devlin<\/a><\/p>\n<pre><code>\n%load_ext sql\n%config SqlMagic.autocommit=False\n%config SqlMagic.autopandas=True\n<\/code><\/pre>\n<p>More info on: <a href=\"https:\/\/github.com\/catherinedevlin\/ipython-sql\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/catherinedevlin\/ipython-sql<\/a><\/p>\n<p>I define the connection string for both:<\/p>\n<pre><code>\n$import socket,cx_Oracle,os\nconnection=cx_Oracle.connect('\"SQL101#'+socket.gethostname().upper()+'\"',\"SQL101#\"+socket.gethostname()[::-1], \"sql101_tp\")\nos.environ['DATABASE_URL']='oracle:\/\/\"SQL101#'+socket.gethostname().upper()+'\":\"SQL101#'+socket.gethostname()[::-1]+'\"@sql101_tp'\n<\/code><\/pre>\n<p>Then I have 4 ways to run queries:<\/p>\n<ul>\n<li>%%sqlplus for fast OCI access<\/li>\n<li>%%sqlcl for additional SQLcl features (javascript, SODA)<\/li>\n<li>%sql when I want the result as Pandas<\/li>\n<li>and directly from Python with the connection defined<\/li>\n<\/ul>\n<p>The examples are in the <a href=\"http:\/\/sql101.pachot.net\" target=\"_blank\" rel=\"noopener noreferrer\">SQL101<\/a> notebook and you can play with them.<\/p>\n<p>Just one more thing, which is probably perfectible:<\/p>\n<pre><code>\nimport cx_Oracle, base64\nfrom IPython.core.display import HTML\ncursor=connection.cursor()\nHTML(\"If you want to view performance of my database during the last hour: <a>1,is_omx =&gt;1,report_level=&gt;'basic',outer_start_time=&gt;created-1\/24,selected_start_time=&gt;created) from user_users\").fetchone()[0].read().encode('utf-8')).decode('utf-8')+\"'&gt;Download PerfHub<\/a>\")\n<\/code><\/pre>\n<p>This displays a download link to get the Performance Hub report covering the time since the beginning of my connection (actually the user creation).<\/p>\n<p>The idea is:<\/p>\n<ul>\n<li>call dbms_perf.report_perfhub<\/li>\n<li>get the row with .fetchone()<\/li>\n<li>get the first column with [0]<\/li>\n<li>read the BLOB with .read()<\/li>\n<li>make it an hexadecimal string with .encode(&#8216;utf-8&#8217;)<\/li>\n<li>encode it in base64 with base64.b64encode()<\/li>\n<li>put it as a hex string with .decode(&#8216;utf-8&#8217;)<\/li>\n<li>build a data URL with text\/html MIME type and base64 encoding<\/li>\n<li>display the link ready to click and download<\/li>\n<\/ul>\n<p>I do that because I prefer to have the performance hub in a plain window, and also because it does not run in an IFRAME as-is.<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-43776\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg\" alt=\"\" width=\"1024\" height=\"493\" \/><\/a><\/p>\n<p>This is a very powerful environment for demos. You can use it there on Google Colab, connected to my database. Or create your own Oracle Autonomous Database in the always free tier and even run Jupyter in this free tier (see <a href=\"https:\/\/gianniceresa.com\/2020\/05\/easy-install-of-jupyterhub-in-an-oci-compute-instance\/\" target=\"_blank\" rel=\"noopener noreferrer\">how<\/a> from Gianni Ceresa)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . My first attempt to connect to an Oracle database from a Jupyter Notebook on Google Colab was about one year ago: https:\/\/medium.com\/@FranckPachot\/a-jupyter-notebook-on-google-collab-to-connect-to-the-oracle-cloud-atp-5e88b12282b0 I&#8217;m currently preparing a notebook as a handout from my coming SQL101 presentation where I start with some NoSQL to discover the benefits of RDBMS and SQL. I&#8217;m running [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":14764,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,59],"tags":[2129,96],"type_dbi":[],"class_list":["post-14763","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-administration-monitoring","category-oracle","tag-jupyter","tag-oracle"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Oracle ADB from a Jupyter Notebook - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Oracle ADB from a Jupyter Notebook\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . My first attempt to connect to an Oracle database from a Jupyter Notebook on Google Colab was about one year ago: https:\/\/medium.com\/@FranckPachot\/a-jupyter-notebook-on-google-collab-to-connect-to-the-oracle-cloud-atp-5e88b12282b0 I&#8217;m currently preparing a notebook as a handout from my coming SQL101 presentation where I start with some NoSQL to discover the benefits of RDBMS and SQL. I&#8217;m running [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-30T15:56:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1909\" \/>\n\t<meta property=\"og:image:height\" content=\"919\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Oracle Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Oracle Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"Oracle ADB from a Jupyter Notebook\",\"datePublished\":\"2020-09-30T15:56:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/\"},\"wordCount\":772,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg\",\"keywords\":[\"Jupyter\",\"Oracle\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/\",\"name\":\"Oracle ADB from a Jupyter Notebook - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg\",\"datePublished\":\"2020-09-30T15:56:04+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg\",\"width\":1909,\"height\":919},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Oracle ADB from a Jupyter Notebook\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\",\"name\":\"Oracle Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"caption\":\"Oracle Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Oracle ADB from a Jupyter Notebook - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/","og_locale":"en_US","og_type":"article","og_title":"Oracle ADB from a Jupyter Notebook","og_description":"By Franck Pachot . My first attempt to connect to an Oracle database from a Jupyter Notebook on Google Colab was about one year ago: https:\/\/medium.com\/@FranckPachot\/a-jupyter-notebook-on-google-collab-to-connect-to-the-oracle-cloud-atp-5e88b12282b0 I&#8217;m currently preparing a notebook as a handout from my coming SQL101 presentation where I start with some NoSQL to discover the benefits of RDBMS and SQL. I&#8217;m running [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/","og_site_name":"dbi Blog","article_published_time":"2020-09-30T15:56:04+00:00","og_image":[{"width":1909,"height":919,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg","type":"image\/jpeg"}],"author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"Oracle ADB from a Jupyter Notebook","datePublished":"2020-09-30T15:56:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/"},"wordCount":772,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg","keywords":["Jupyter","Oracle"],"articleSection":["Database Administration &amp; Monitoring","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/","url":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/","name":"Oracle ADB from a Jupyter Notebook - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg","datePublished":"2020-09-30T15:56:04+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/Screenshot-2020-09-30-163911.jpg","width":1909,"height":919},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/oracle-adb-jupyter\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Oracle ADB from a Jupyter Notebook"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee","name":"Oracle Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","caption":"Oracle Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/14763","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=14763"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/14763\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/14764"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=14763"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=14763"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=14763"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=14763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}