{"id":160,"date":"2020-06-17T19:31:14","date_gmt":"2020-06-17T17:31:14","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=160"},"modified":"2020-06-22T19:02:24","modified_gmt":"2020-06-22T17:02:24","slug":"sqlite","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=160","title":{"rendered":"SQLite"},"content":{"rendered":"\n<p>SQLite es un sistema de gesti\u00f3n de bases de datos relacional (RDBMS). A diferencia de otros sistemas de bases de datos relacionales, este es una peque\u00f1a librer\u00eda escrita en C que ha de formar parte del programa que lo usa. La base de datos es un fichero que generalmente acompa\u00f1a al programa y que contiene todos los elementos de la misma, como son las tablas, \u00edndices o los datos. Todo esto hace que el acceso sea muy r\u00e1pido, pero como los datos se guardan en un fichero, este se ha de bloquear en cada transacci\u00f3n dificultando el uso concurrente. Esto hace que SQLite no sea rival con otras bases de datos como MySQL o PostgreSQL.<\/p>\n\n\n\n<p>Sin embargo, el resto de ventajas y el hecho de que la licencia sea de dominio p\u00fablico, hacen esta librer\u00eda \u00fanica para programas que necesiten gesti\u00f3n de bases de datos.<\/p>\n\n\n\n<p>La versi\u00f3n 3 de SQLite permite bases de datos de hasta 2 terabytes.<\/p>\n\n\n\n<p>Python 3 trae incorporado una interface api para el acceso a bases de datos SQLite. Por lo que para usar este tipo de bases de datos solo es necesario incluir el paquete&nbsp;<strong>sqlite3<\/strong>&nbsp;en la aplicaci\u00f3n. Esto se consigue con la sentencia siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import sqlite3<\/code><\/pre>\n\n\n\n<p>Dado que la base de datos es un fichero y generalmente se pondr\u00e1 en la misma carpeta donde se encuentra la aplicaci\u00f3n, puede resultar interesante hacer uso del paquete&nbsp;<strong>os<\/strong>&nbsp;para obtener la ruta con el m\u00e9todo&nbsp;<strong>getcwd()<\/strong>. Si la base de datos se llamara&nbsp;<strong>test.db3<\/strong>, una forma de obtener la ruta desde cualquier plataforma, podr\u00eda ser esta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import os\ndb = os.path.join(os.getcwd(),'test.db3')<\/code><\/pre>\n\n\n\n<p>Al tener la ruta asignada a la variable&nbsp;<strong>db<\/strong>, el siguiente paso ser\u00e1 conectar la aplicaci\u00f3n a la misma. Para esto, se hace uso del m\u00e9todo&nbsp;<strong>connect()<\/strong>&nbsp;de&nbsp;<strong>sqlite3<\/strong>&nbsp;para asignar el objeto&nbsp;<strong>sqlite3.Conection<\/strong>&nbsp;de la conexi\u00f3n a una variable, de la siguiente forma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">con = sqlite3.connect(db)<\/code><\/pre>\n\n\n\n<p>Con la conexi\u00f3n hecha sin errores, el siguiente paso es crear un objeto cursor con el que se podr\u00e1n ejecutar las sentencias SQL contra la base de datos. Para esto se usa el m\u00e9todo&nbsp;<strong>cursor()<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">cur = con.cursor()<\/code><\/pre>\n\n\n\n<p>Con el cursor creado se puede, por ejemplo, detectar si la tabla ya existe, borrarla si fuera el caso y crear una nueva. Para ello hay que ejecutar las sentencias siguientes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">cur.execute('''\nDROP TABLE IF EXISTS Users''')\ncur.execute('''\nCREATE TABLE Users (nombre VARCHAR(128),email VARCHAR(128))''')<\/code><\/pre>\n\n\n\n<p>Se suele hacer un commit de la conexi\u00f3n para asegurarnos que todas las transacciones se han realizado correctamente antes de cerrar la conexi\u00f3n del cursor y la conexi\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">con.commit()\ncur.close()\ncon.close()<\/code><\/pre>\n\n\n\n<p>El ejemplo completo quedar\u00eda as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import sqlite3\nimport os\ndb = os.path.join(os.getcwd(),'test.db3')\ncon = sqlite3.connect(db)\ncur = con.cursor()\ncur.execute('''\nDROP TABLE IF EXISTS Users''')\ncur.execute('''\nCREATE TABLE Users (nombre VARCHAR(128),email VARCHAR(128))''')\ncon.commit()\ncur.close()\ncon.close()<\/code><\/pre>\n\n\n\n<p>Tras la ejecuci\u00f3n, se habr\u00e1 creado una base de datos llamada&nbsp;<strong>test.db3<\/strong>&nbsp;en la carpeta de la aplicaci\u00f3n, esta base de datos contiene una tabla vac\u00eda llamada&nbsp;<strong>Users<\/strong>.<\/p>\n\n\n\n<p>Para rellenarla con alg\u00fan dato, pongamos por caso con diez nombres y emails, se puede usar el siguiente c\u00f3digo. Este crear\u00e1 10 usuarios comenzando por Usuario1, Usuario2, \u2026, hasta Usuario10 y 10 emails del tipo Usuario1@pythonparatodo.com,&#8230;.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import sqlite3\nimport os\ndb = os.path.join(os.getcwd(),'test.db3')\ncon = sqlite3.connect(db)\ncur = con.cursor()\nnombre='Usuario'\nfor x in range(10):\n    cur.execute('''\n     INSERT OR IGNORE INTO Users\n     (nombre, email) VALUES (?,?)\n    ''',(nombre+str(x+1),nombre+str(x+1)+'@pythonparatodo.com'))\ncon.commit()\ncur.close()\ncon.close()<\/code><\/pre>\n\n\n\n<p>Para poder ver el contenido de la tabla, tan solo hay que hacer uso de la instrucci\u00f3n SELECT de SQL para obtener los datos y mostrarlos en pantalla.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import sqlite3\nimport os\ndb = os.path.join(os.getcwd(),'test.db3')\ncon = sqlite3.connect(db)\ncur = con.cursor()\nnombre='Usuario'\ndatos = cur.execute('''\nSELECT * FROM Users ''')\nfor registro in datos:\n    print(registro)\ncon.commit()\ncur.close()\ncon.close()<\/code><\/pre>\n\n\n\n<p>Siendo este el resultado obtenido.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">('Usuario1', 'Usuario1@pythonparatodo.com')\n('Usuario2', 'Usuario2@pythonparatodo.com')\n('Usuario3', 'Usuario3@pythonparatodo.com')\n('Usuario4', 'Usuario4@pythonparatodo.com')\n('Usuario5', 'Usuario5@pythonparatodo.com')\n('Usuario6', 'Usuario6@pythonparatodo.com')\n('Usuario7', 'Usuario7@pythonparatodo.com')\n('Usuario8', 'Usuario8@pythonparatodo.com')\n('Usuario9', 'Usuario9@pythonparatodo.com')\n('Usuario10', 'Usuario10@pythonparatodo.com')<\/code><\/pre>\n\n\n\n<p>La web de SQLite se encuentra aqu\u00ed:&nbsp;<a href=\"https:\/\/sqlite.org\/index.html\">https:\/\/sqlite.org\/index.html<\/a>.<\/p>\n\n\n\n<p>Para facilitar la visualizaci\u00f3n de datos es posible usar cualquier browser SQLite,&nbsp;<strong>DB Browser for SQLite<\/strong>&nbsp;es uno gratuito multiplataforma que se encuentra en la siguiente web:&nbsp;<a href=\"https:\/\/sqlitebrowser.org\/\">https:\/\/sqlitebrowser.org<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SQLite es un sistema de gesti\u00f3n de bases de datos relacional (RDBMS). A diferencia de otros sistemas de bases de &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[74,4,73],"tags":[77,2,6,75,76],"class_list":["post-160","post","type-post","status-publish","format-standard","hentry","category-bases-de-datos","category-python","category-sqlite","tag-bases-de-datos","tag-python","tag-python3","tag-sqlite","tag-sqlite3"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=160"}],"version-history":[{"count":5,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/160\/revisions"}],"predecessor-version":[{"id":165,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/160\/revisions\/165"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}