{"id":177,"date":"2020-06-23T18:17:51","date_gmt":"2020-06-23T16:17:51","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=177"},"modified":"2020-06-25T15:45:22","modified_gmt":"2020-06-25T13:45:22","slug":"sqlite-y-funciones-definidas-por-el-usuario-create_function","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=177","title":{"rendered":"Sqlite y funciones definidas por el usuario: create_function()"},"content":{"rendered":"\n<p>Sqlite ya dispone de muchas funciones incorporadas como: <strong>COUNT<\/strong>,\u00a0<strong>MAX<\/strong>,\u00a0<strong>MIN<\/strong>,\u00a0<strong>AVG<\/strong>,\u00a0<strong>SUM<\/strong>,\u00a0<strong>LENGTH<\/strong>,\u00a0<strong>LOWER<\/strong>,\u00a0<strong>UPPER<\/strong>,\u00a0<strong>SUBSTR<\/strong>,\u00a0<strong>REPLACE<\/strong>,\u00a0<strong>DATE<\/strong>,\u00a0<strong>DATETIME<\/strong>, etc. <\/p>\n\n\n\n<p>Pero adem\u00e1s, se pueden crear funciones definidas por el usuario para procesar los datos obtenidos o los datos a insertar en la forma que el usuario crea conveniente.<\/p>\n\n\n\n<p>Para crear una funci\u00f3n definida por el usuario se usa el m\u00e9todo&nbsp;<strong>create_function<\/strong>() de sqlite3, al cual hay que pasarle tres argumentos, el primero es el nombre que tendr\u00e1 la funci\u00f3n en la sentencia SQL, el segundo es el n\u00famero de argumentos que se le pasa esta funci\u00f3n y el tercero es el nombre de la funci\u00f3n Python que realizar\u00e1 el proceso.<\/p>\n\n\n\n<p>En el siguiente ejemplo, se construye una tabla de usuarios y contrase\u00f1as y se crea una funci\u00f3n de Python para obtener el hash de una contrase\u00f1a de SQLite. Luego se usa el m\u00e9todo create_function() para definir una funci\u00f3n que se pasa a sentencia SQL.<\/p>\n\n\n\n<p>Lo primero, es importar las librer\u00edas necesarias y crear la base de datos y la tabla de usuarios con los campos id, nombre y password.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import os\nimport sqlite3\nfrom hashlib import blake2b\ndb = os.path.join(os.getcwd(),'test.db3')\ncon = sqlite3.connect(db)\ncur = con.cursor()\ncur.execute('''\nCREATE TABLE Usuarios (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, nombre VARCHAR(128), password VARCHAR(128))\n''')\ncon.commit()\ncon.close()<\/code><\/pre>\n\n\n\n<p>Tras esto habr\u00e1 que crear una funci\u00f3n en Python que retorne el hash de la contrase\u00f1a pasada como argumento y luego aplicarle la funci\u00f3n al objeto conectado a la base de datos. Se pasa entre comillas el nombre de la funci\u00f3n que se escribir\u00e1 en la sentencia SQL, el n\u00famero de argumentos a pasar que en este caso es uno, es decir, la contrase\u00f1a y el tercer argumento, que es el nombre de la funci\u00f3n anteriormente definida en Python.&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">def _encripta_password(password):\n    o = blake2b()\n    o.update(password.encode('utf-8'))\n    return o.hexdigest()\n\ncon.create_function('encripta_password',1,_encripta_password)\ncur = con.cursor()<\/code><\/pre>\n\n\n\n<p>Tras definir la funci\u00f3n, se puede usar de la siguiente forma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">dato = ('Javier','Password')\ncur.execute('''\nINSERT INTO Usuarios (nombre,password) VALUES (?,encripta_password(?))''', dato)\ncon.commit()<\/code><\/pre>\n\n\n\n<p>Como se puede apreciar el segundo par\u00e1metro que se le pasa a la sentencia&nbsp;<strong>INSERT<\/strong>&nbsp;est\u00e1 usando la funci\u00f3n&nbsp;<strong>encripta_password()<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sqlite ya dispone de muchas funciones incorporadas como: COUNT,\u00a0MAX,\u00a0MIN,\u00a0AVG,\u00a0SUM,\u00a0LENGTH,\u00a0LOWER,\u00a0UPPER,\u00a0SUBSTR,\u00a0REPLACE,\u00a0DATE,\u00a0DATETIME, etc. Pero adem\u00e1s, se pueden crear funciones definidas por el usuario &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,81,82,2,6,76],"class_list":["post-177","post","type-post","status-publish","format-standard","hentry","category-bases-de-datos","category-python","category-sqlite","tag-bases-de-datos","tag-def","tag-funciones-definidas-por-el-usuario","tag-python","tag-python3","tag-sqlite3"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/177","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=177"}],"version-history":[{"count":8,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/177\/revisions"}],"predecessor-version":[{"id":187,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/177\/revisions\/187"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=177"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}