Categorías
Python

Para comenzar con las pruebas en Python

 

Tabla de Contenidos

  • SQL vs NoSQL
  • MongoDB
  • PyMongoEstablishing un ConnectionAccessing DatabasesInserting DocumentsRetrieving los documentos de la
  • establecer una conexión
  • acceder a las bases
  • Inserción de documentos de
  • recuperar documentos
  • MongoEngineDefining un DocumentSaving DocumentsObject Oriented FeaturesReferencing Otros documentos
  • La definición de un Documentos Documento
  • ahorro de
  • características orientadas a objetos
  • referencia a otros documentos
  • Conclusión
  • establecer una conexión
  • acceder a las bases
  • Inserción de documentos de
  • recuperar documentos
  • la definición de un documento
  • de guardar documentos
  • orientada a objetos Características
  • referencia a otros documentos

Python es un lenguaje de programación potente utilizado durante muchos diferen t tipos de aplicaciones dentro de la comunidad de desarrollo. Muchos lo conocen como un lenguaje flexible que puede manejar casi cualquier tarea.

Así que, ¿qué pasaría si nuestra aplicación Python complejo necesita una base de datos que es tan flexible como el lenguaje mismo?

Aquí es donde NoSQL, y, específicamente, MongoDB, entran en juego. Bono

gratuito: Haga clic aquí para descargar un esqueleto proyecto Python + MongoDB con código fuente completo que muestra cómo el acceso MongoDB desde Python.

A lo largo de este artículo le mostraremos cómo utilizar Python para interfaz con la base de datos MongoDB populares (v3.4.0), junto con una descripción general de SQL vs NoSQL, PyMongo (v3.4.0), y MongoEngine (v0.10.7 ), entre otras cosas.

SQL vs caso NoSQL

En que no están familiarizados con ella, MongoDB es una base de datos NoSQL que se ha vuelto muy popular en toda la industria en los últimos años. bases de datos NoSQL proporcionan características de recuperación y el almacenamiento de datos de una manera muy diferente que sus contrapartes de bases de datos relacionales.

Durante décadas, bases de datos SQL que se utilizan para ser una de las únicas opciones para los desarrolladores que buscan construir grandes sistemas escalables. Sin embargo, la creciente necesidad de la capacidad de almacenar estructuras de datos complejas dado lugar al nacimiento de las bases de datos NoSQL, que permiten a los desarrolladores almacenar datos heterogéneos y de estructura menos.

Cuando se trata de las opciones disponibles, la mayoría de la gente tiene que hacerse la pregunta definitiva, “SQL o NoSQL?” SQL y NoSQL tienen sus puntos fuertes y débiles, y usted debe elegir la que más se ajuste a sus requisitos de aplicación lo mejor. Aquí hay algunas diferencias entre los dos:

SQL

  • El modelo es de naturaleza relacional
  • Los datos se almacenan en tablas
  • adecuados para soluciones donde cada registro es de la misma clase y posee las mismas propiedades
  • Adición de un nuevo medio de propiedad que tienen que alterar todo el esquema
  • el esquema es muy estricto transacciones
  • ACID son compatibles
  • escala bien verticalmente

NoSQL

  • el modelo es no relacional
  • Puede ser almacenada como JSON, clave-valor, etc. (dependiendo del tipo de base de datos NoSQL)
  • No cada registro tiene que ser de la misma naturaleza, por lo que es muy flexible
  • Añadir nuevas propiedades a los datos sin molestar a cualquier cosa requisitos de esquema
  • No hay a que se adhieran a
  • Soporte para transacciones ACID puede variar dependiendo de la NoSQL DB se utiliza
  • La consistencia puede variar
  • Escalas nos ll horizontal

Hay muchas otras diferencias entre los dos tipos de bases de datos, pero los mencionados anteriormente son algunas de las diferencias más importantes que debe saber.

En función de su situación específica, puede ser preferible el uso de una base de datos SQL, mientras que en otros escenarios NoSQL es la elección más obvia para hacer. Al elegir una base de datos debe tener en cuenta las fortalezas y debilidades de cada base de datos con cuidado.

Una de las mejores cosas de NoSQL es que hay muchos tipos diferentes de bases de datos para elegir, y cada uno tiene sus propios casos de uso:

  • Clave Valor-tienda: DynamoDB
  • almacén de documentos: CouchDB, MongoDB, RethinkDB
  • columna de la tienda: Cassandra
  • estructuras de datos: Redis

Hay bastantes más, pero estos son algunos de los tipos más comunes.

En los últimos años, las bases de datos SQL y NoSQL siquiera han comenzado a fusionarse. Por ejemplo, PostgreSQL ahora soporta el almacenamiento y consulta de datos JSON, al igual que Mongo. Con esto, ahora se puede lograr mucho de lo mismo con Postgres que pueda con Mongo, pero aún así no conseguir muchas de las ventajas de Mongo (como la escala horizontal y la interfaz sencilla, etc.). Como en este artículo pone:

Si sus datos activa se encuentra en el esquema relacional cómodamente y el contenido JSON es una cohorte a que los datos, entonces debería estar bien con PostgreSQL y es mucho más eficiente representación JSONB y las capacidades de indexación. Si embargo, el modelo de datos es el de una colección de documentos mutables entonces es probable que desee ver en una base de datos diseñada principalmente en torno a los documentos JSON como MongoDB o RethinkDB.

MongoDB

Ahora vamos a cambiar nuestra atención hacia el foco principal de este artículo y arrojar algo de luz sobre los detalles de MongoDB.

MongoDB es un programa de base orientada a documentos, de código abierto que es independiente de la plataforma. MongoDB, al igual que algunas otras bases de datos NoSQL (pero no todos!), Almacena sus datos en los documentos utilizando una estructura JSON. Esto es lo que permite que los datos sean tan flexibles y no requieren de un esquema.

Algunas de las características más importantes son:

  • Usted tiene soporte para muchos de los tipos de consulta estándar, como coincidente (==), la comparación (<, >), o incluso regex
  • Usted puede almacenar prácticamente cualquier tipo de de datos – ya sea estructurada, parcialmente estructurada, o incluso polimórfica
  • para escalar y manejar más consultas, basta con añadir más máquinas
  • es altamente flexible y ágil, que le permite desarrollar rápidamente sus aplicaciones
  • Siendo una base de datos basada en documentos significa que puede almacenar toda la información relativa a su modelo en un solo documento
  • puede cambiar el esquema de la base de datos sobre la marcha
  • Muchas funcionalidades de bases de datos relacionales también están disponibles en MongoDB (por ejemplo, la indexación)

en cuanto a la parte operativa de las cosas, hay un buen número de herramientas y funciones para MongoDB que simplemente no se puede encontrar con cualquier otro sistema de base de datos:

  • Si usted necesita un servidor independiente o racimos completos de servidores independientes, MongoDB es tan escalable a medida que lo necesita ser
  • MongoDB también proporciona equilibrio de carga de apoyo al mover automáticamente los datos a través de los diversos fragmentos
  • Tiene soporte automático de conmutación por error – en caso de que el servidor primario se cae, un nuevo primaria estará en funcionamiento automáticamente
  • el Servicio de Gestión de MongoDB o MMS es una herramienta web muy agradable que le proporciona la capacidad de realizar un seguimiento de sus máquinas
  • Gracias a los archivos de memoria asignada, se ahorrará un poco de memoria RAM, a diferencia de las bases de datos relacionales

Si usted toma ventaja de las características de indexación, gran parte de esta información será guardada en la memoria para la recuperación rápida. E incluso sin la indexación en las teclas de documentos específicos, Mongo almacena en caché un poco de datos utilizando el método menos utilizado recientemente.

Aunque a primera Mongo puede parecer que es la solución a muchos de nuestros problemas de base de datos, no está exenta de inconvenientes. Uno de los inconvenientes que escuchará con frecuencia sobre Mongo es su falta de apoyo para transacciones ACID. Mongo hace transacciones ACID apoyo en un sentido limitado, pero no en todos los casos. A nivel de un único documento, las transacciones ACID son compatibles (que es donde la mayoría de las transacciones se llevan a cabo de todos modos). Sin embargo, las transacciones que se ocupan de múltiples documentos no son compatibles debido a la naturaleza distribuida de Mongo.

Mongo también carece de soporte para las uniones nativa, lo que se debe hacer de forma manual (y por lo tanto mucho más lentamente). Los documentos están destinados a ser todo lo abarca, lo que significa, en general, no deberían tener que hacer referencia a otros documentos. En el mundo real esto no siempre funciona como muchos de los datos con los que trabajamos es por naturaleza relacional. Por lo tanto, muchos dirán que Mongo debe ser utilizado como una base de datos complementarios a una base de datos SQL, pero a medida que se utiliza MongoDB usted encontrará que no es necesariamente cierto.

PyMongo

Ahora que hemos descrito lo que MongoDB es exactamente, vamos a averiguar cómo le gustaría realmente se utilicen con Python. El piloto oficial publicado por los desarrolladores de Mongo se llama PyMongo. Este es un buen lugar para empezar cuando la primera cocción de Python con MongoDB. Vamos a ir a través de algunos ejemplos aquí, pero también se debe examinar la documentación completa, ya que no será capaz de cubrir todo.

Lo primero que querrá hacer es instalar PyMongo en su entorno virtual. La forma más fácil de hacerlo es con pip:

$ pip install pymongo==3.4.0

NOTA: Para una verificación más completa guía de la página Instalación / actualización de los documentos y seguir los pasos que hay que ponerse en marcha.

Una vez que haya terminado con la configuración, se inicia la consola Python y ejecute el siguiente comando:

>>> import pymongo

Si se ejecuta sin levantar ninguna excepción dentro de la terminal de Python, entonces su bien sólo tiene que instalar trabajado. Si no es así, a continuación, realizar cuidadosamente los pasos de nuevo. Salir de la cáscara de una vez hecho.

A continuación, usted tiene que instalar la base de datos real MongoDB.

Si estás en un Mac, se recomienda utilizar Homebrew, pero puede tener una preferencia diferente. Si el uso de Homebrew, ejecute este comando:

$ brew install mongodb

Una vez hecho esto, siga las instrucciones para configurar el directorio de datos para almacenar datos localmente.

Si usted no está usando un Mac, se pueden encontrar algunos grandes guías de instalación en la página Instalar MongoDB de los documentos oficiales. Allí encontrará tutoriales sobre cómo instalar MongoDB para Linux, OS X y Windows.

Una vez instalado, dentro de una nueva ventana de terminal, utilice el siguiente comando para iniciar el demonio Mongo:

$ mongod

NOTA: Dependiendo de su método de instalación, es posible que tenga que ejecutar mongod con sudo.

Ahora vamos a empezar con lo básico de PyMongo.

Establecimiento de una conexión

Para establecer una conexión usaremos el objeto MongoClient.

Lo primero que tenemos que hacer con el fin de establecer una conexión es importar la clase MongoClient. Usaremos esto para comunicarse con la instancia de base de funcionamiento. Utilice el siguiente código para hacerlo:

from pymongo import MongoClient
client = MongoClient()

Utilizando el fragmento anterior, se establecerá la conexión con el servidor por defecto (localhost) y el puerto (27017). También puede especificar el host y / o puerto usando:

client = MongoClient('localhost', 27017)

o simplemente utilizar el formato Mongo URI:

client = MongoClient('mongodb://localhost:27017')

Todas estas llamadas a MongoClient va a hacer lo mismo; sólo depende de la forma explícita que desea ser en el código.

acceder a las bases

Una vez que tenga una instancia de MongoClient conectado, puede acceder a cualquiera de las bases de datos dentro de ese servidor de Mongo. Para especificar qué base de datos que realmente desea utilizar, puede acceder a él como un atributo:

db = client.pymongo_test

O también puede utilizar el acceso de diccionario:

db = client['pymongo_test']

En realidad, no importa si su base de datos especificado se ha creado todavía. Al especificar el nombre de base de datos y almacenamiento de los datos a ella, se crea la base de datos de forma automática. Documentos

Inserción

almacenar datos en su base de datos es tan fácil como llamar sólo dos líneas de código. La primera línea que especifica la colección que va a utilizar (puestos en el ejemplo a continuación). En la terminología de MongoDB, una colección es un conjunto de documentos que se almacenan juntos dentro de la base de datos. Colecciones y documentos son similares a las tablas SQL y filas, respectivamente. Recuperando una colección es tan fácil como conseguir una base de datos.

La segunda línea es donde realmente se inserta los datos en la colección utilizando el método insert_one ():

posts = db.posts
post_data = {
'title': 'Python and MongoDB',
'content': 'PyMongo is fun, you guys',
'author': 'Scott'
}
result = posts.insert_one(post_data)
print('One post: {0}'.format(result.inserted_id))

Podemos incluso insertar muchos documentos a la vez, que es mucho más rápido que usar insert_one () si tiene muchos documentos añadir a la base de datos. El método a utilizar aquí es insert_many (). Este método toma una matriz de datos de documentos:

post_1 = {
'title': 'Python and MongoDB',
'content': 'PyMongo is fun, you guys',
'author': 'Scott'
}
post_2 = {
'title': 'Virtual Environments',
'content': 'Use virtual environments, you guys',
'author': 'Scott'
}
post_3 = {
'title': 'Learning Python',
'content': 'Learn Python, it is easy',
'author': 'Bill'
}
new_result = posts.insert_many([post_1, post_2, post_3])
print('Multiple posts: {0}'.format(new_result.inserted_ids))

Cuando RAN, debería ver algo como:

One post: 584d947dea542a13e9ec7ae6
Multiple posts: [
ObjectId('584d947dea542a13e9ec7ae7'),
ObjectId('584d947dea542a13e9ec7ae8'),
ObjectId('584d947dea542a13e9ec7ae9')
]

NOTA: no se preocupe que sus ObjectID no coinciden con los mostrados anteriormente. Ellos son generadas dinámicamente cuando se insertan datos y consisten en una época Unix, identificador de la máquina, y otros datos únicos.

recuperar documentos

para recuperar un documento, utilizaremos el método find_one (). El único argumento que utilizaremos aquí (a pesar de que es compatible con muchos más) es un diccionario que contiene campos de igualar. En nuestro siguiente ejemplo, queremos recuperar el puesto que fue escrita por Bill:

bills_post = posts.find_one({'author': 'Bill'})
print(bills_post)

Ejecutar este:

{
'author': 'Bill',
'title': 'Learning Python',
'content': 'Learn Python, it is easy',
'_id': ObjectId('584c4afdea542a766d254241')
}

Usted puede haber notado que OBJECTID del mensaje se establece en la clave _id, que podemos utilizar más adelante para identificar de forma exclusiva si es necesario. Si queremos encontrar más de un documento, podemos utilizar el método find (). Esta vez, vamos a encontrar todos los mensajes escritos por Scott:

scotts_posts = posts.find({'author': 'Scott'})
print(scotts_posts)

Run:

La diferencia principal es que los datos del documento no se devuelve directamente a nosotros como una matriz. En su lugar tenemos una instancia del objeto Cursor. Este cursor es un objeto iterable que contiene un buen número de métodos de ayuda para ayudarle a trabajar con los datos. Para obtener cada documento, simplemente iterar sobre el resultado:

for post in scotts_posts:
print(post)

MongoEngine

Mientras PyMongo es muy fácil de usar y en general una gran biblioteca, que es probablemente un poco demasiado bajo nivel para muchos proyectos por ahí. Dicho de otra manera, usted tendrá que escribir una gran cantidad de su propio código para consistentemente guardar, recuperar y objetos de borrado.

Una biblioteca que proporciona una abstracción más alto en la parte superior de PyMongo es MongoEngine. MongoEngine es un asignador de objeto de documento (ODM), que es aproximadamente equivalente a un mapeador relacional de objetos basado en SQL (ORM). La abstracción proporcionada por MongoEngine está basada en la clase, por lo que todos los modelos que se crean son clases.

Mientras que un buen número de bibliotecas de Python existen para ayudarle a trabajar con MongoDB, MongoEngine es uno de los mejores ya que tiene una mezcla agradable de características, flexibilidad y apoyo de la comunidad sin llegar a ser demasiado obstinado.

de instalar, usar PIP:

$ pip install mongoengine==0.10.7

Una vez instalado, hay que dirigir la biblioteca para conectar con nuestro funcionamiento instancia de Mongo. Para ello vamos a tener que utilizar la función connect () y pasar el host y el puerto de la base de datos MongoDB a ella. Dentro de la terminal de Python, escriba:

from mongoengine import *
connect('mongoengine_test', host='localhost', port=27017)

Aquí se especifica el nombre de la base de datos y la ubicación. Dado que todavía estamos utilizando el host y el puerto por defecto, se puede omitir estos parámetros.

la definición de un documento

Para configurar nuestro objeto de documento, es necesario definir qué datos queremos que nuestro objeto de documento que tenga. Al igual que en muchos otros ORM, vamos a hacer esto creando una subclase de la clase de documento y la disponibilidad para los tipos de datos que queremos:

import datetime

class Post(Document):
title = StringField(required=True, max_length=200)
content = StringField(required=True)
author = StringField(required=True, max_length=50)
published = DateTimeField(default=datetime.datetime.now)

NOTA: Una de las tareas más difíciles con los modelos de base de datos es la validación de datos. ¿Cómo se asegura de que los datos que guardas se ajusta a un formato que necesita? El hecho de que una base de datos se dice que es sin esquema no quiere decir que es sin esquema .

En este modelo simple, ya hemos dicho MongoEngine que esperar una instancia de mensaje para tener un título, contenido, autor, y la fecha de su publicación. Ahora bien, el objeto de base de documentos puede utilizar esa información para validar los datos que se le proporcionen.

Así, por ejemplo, si tratamos de guardar un mensaje sin un título, entonces va a lanzar una excepción y informarnos. Podemos tomar esto aún más y agregar más restricciones, como la longitud de la cadena. Tenga en cuenta que algunos de los campos tienen un conjunto de parámetros max_length. Esto le dice al documento, como habrá adivinado, para permitir solamente una longitud máxima de la cadena de caracteres sin embargo muchos que especificamos. Hay un buen número de parámetros de la misma familia que podemos establecer, entre ellos:

  • db_field: especificar un nombre diferente ámbito
  • requiere: Asegúrese de que este campo se establece por defecto
  • : Utilice el valor por defecto dado si no se proporciona ningún otro valor
  • único: Asegúrese de que ningún otro documento de la colección tiene el mismo valor para este campo opciones
  • : Asegúrese de que el valor del campo es igual a uno de los valores dados en una matriz

Cada tipo de campo tiene su propio conjunto de parámetros, así que asegúrese de comprobar la documentación para obtener más información.

Guardar documentos

Para guardar un documento en nuestra base de datos, vamos a utilizar el método Save (). Si el documento ya existe en la base de datos, entonces todos los cambios se harán en el nivel atómico al documento existente. Si no existe, sin embargo, a continuación, se creará.

Aquí está un ejemplo de cómo crear y guardar un documento:

post_1 = Post(
title='Sample Post',
content='Some engaging content',
author='Scott'
)
post_1.save() # This will perform an insert
print(post_1.title)
post_1.title = 'A Better Post Title'
post_1.save() # This will perform an atomic edit on "title"
print(post_1.title)

Un par de cosas a la nota sobre la llamada .save ():

  • PyMongo realizará la validación cuando se llama .save (). Esto significa que será comprobar los datos que guardas con el esquema que declaró en la clase. Si se viola el esquema (o una restricción), entonces se produce una excepción y los datos no se guardan.
  • Desde Mongo no admite transacciones verdaderas, no hay manera de “volver rollo” la llamada .save () como se hace en bases de datos SQL. Aunque se puede conseguir cerca de las transacciones que realizan con dos confirmaciones de fase, que aún no son compatibles con reversiones.

¿Qué pasa cuando salga fuera el título?

post_2 = Post(content='Content goes here', author='Michael')
post_2.save()

Debería ver la siguiente excepción:

raise ValidationError(message, errors=errors)
mongoengine.errors.ValidationError:
ValidationError (Post:None) (Field is required: ['title'])

Orientada a Objetos Características

Con MongoEngine estando orientado objeto, también se puede añadir métodos a su documento con subclases. Considere el siguiente ejemplo, donde se utiliza una función para modificar la queryset predeterminado (que devuelve todos los objetos de la colección). Mediante el uso de esto, podemos aplicar un filtro por defecto a la clase y obtener sólo los objetos deseados:

class Post(Document):
title = StringField()
published = BooleanField()

@queryset_manager
def live_posts(clazz, queryset):
return queryset.filter(published=True)

referencia a otros documentos

También puede utilizar el objeto ReferenceField para crear una referencia de un documento a otro. MongoEngine maneja el vago-de referencia automáticamente en el momento de acceso, que es más robusto y menos propenso a errores de tener que acordarse de hacerlo usted mismo en todas partes de su código. Un ejemplo:

class Author(Document):
name = StringField()

class Post(Document):
author = ReferenceField(Author)

Post.objects.first().author.name

En el código anterior, utilizando una referencia de documento, podemos encontrar fácilmente el autor del primer puesto.

Hay bastantes más clases de campo (y parámetros) que lo que presentamos aquí, así que asegúrese de revisar la documentación sobre los campos para obtener más información.

De todos estos ejemplos que usted debe ser capaz de ver que MongoEngine es muy adecuado para administrar los objetos de la base para cualquier tipo de aplicación. Las características disponibles a disposición de los desarrolladores hacen que sea muy fácil crear un programa eficiente y escalable. En caso de que usted está buscando más ayuda relacionada con MongoEngine, asegúrese de revisar su guía de usuario completa.

Conclusión

Con Python ser un alto nivel, altamente escalable, lenguaje moderno, que necesita una base de datos (y el conductor) que puede mantener la altura de su potencial, por lo que MongoDB es tal un buen ajuste. Bono

gratuito: Haga clic aquí para descargar un esqueleto proyecto Python + MongoDB con código fuente completo que muestra cómo el acceso MongoDB desde Python.

Vimos en este artículo cómo podemos aprovechar las fortalezas de MongoDB a nuestra ventaja y construir una aplicación altamente flexible y escalable. No dude en hacernos saber sus pensamientos en la sección de comentarios!

Esta es una pieza colaboración entre Scott Robinson, autor de la pila Abuso y la gente en el Real Python.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *