Herramientas de usuario

Herramientas del sitio


fw:elixir

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
fw:elixir [2011/08/04 15:08]
alfred
fw:elixir [2020/05/09 09:25] (actual)
Línea 25: Línea 25:
 metadata.bind = "​sqlite:///​movies.sqlite"​ metadata.bind = "​sqlite:///​movies.sqlite"​
 </​code>​ </​code>​
 +
  
  
 ==== Crear el modelo ==== ==== Crear el modelo ====
 Una vez tengamos el modelo definido utilizaremos los métodos siguientes: Una vez tengamos el modelo definido utilizaremos los métodos siguientes:
-  * ''​setup_all'' ​crea los objetos tabla que hemos indicado. Si le pasásemos ''​True''​ como argumento crearía todas las tablas de una vez. +  * ''​setup_all'' ​enlaza ​los objetos tabla que hemos indicado, es el método que tendremos que llamar para iniciar un modelo (tanto si existe como si no). Si le pasásemos ''​True''​ como argumento crearía todas las tablas de una vez. 
-  * ''​create_all''​ lanza los SQL a la base de datos.+  * ''​create_all''​ lanza los SQL de creación ​a la base de datos.
  
 ==== Cosas a saber ==== ==== Cosas a saber ====
Línea 86: Línea 87:
  
 ===== Elementos del modelo ===== ===== Elementos del modelo =====
 +
 +
 +
 +
 +
 +
 +
  
  
Línea 103: Línea 111:
   * ''​Integer''​   * ''​Integer''​
   * ''​UnicodeText'',​ texto largo.   * ''​UnicodeText'',​ texto largo.
 +  * ''​BigInteger''​
 +  * ''​Boolean''​
 +  * ''​Date'',​ se introduciría por ejemplo como: ''​element.date_retrieved = datetime.datetime.date(datetime.datetime.now())''​
 +  * ''​DateTime''​
 +  * ''​Enum'',​ para hacer enumeraciones:​
 +<code python>
 +class MyStuff(Entity):​
 +    e = Field(Enum(u'​foobar',​ u'​baz',​ u'​quux',​ None))
 +</​code>​
 === Sobre los campos... === === Sobre los campos... ===
   * Podemos indicar que un campo sea clave primaria pasándole por parámetro ''​primary_key=True''​. Si no lo hacemos la clave se generará una automáticamente.   * Podemos indicar que un campo sea clave primaria pasándole por parámetro ''​primary_key=True''​. Si no lo hacemos la clave se generará una automáticamente.
Línea 111: Línea 128:
     his_unique_number = Field(Integer,​ unique=True)     his_unique_number = Field(Integer,​ unique=True)
 </​code>​ </​code>​
- +  * Podemos indicar si un campo puede ser nulo mediante el parámetro ''​nullable''​. 
- +  * Podemos indicar que se indexe un campo agregando el parámetro ''​index=True'':​ 
 +<code python>​ 
 +class Article(Entity):​ 
 +    aid = Field(UnicodeText,​ index = True) 
 +    title = Field(UnicodeText,​ nullable = True) 
 +</​code>​ 
 +  * Podemos indicar que un valor por defecto lo coja de una función: 
 +<code python>​ 
 +class Article(Entity):​ 
 +    last_updated = Field(DateTime,​ default=datetime.datetime.now) 
 +</​code>​ 
 +=== Propiedades y métodos de las entidades === 
 +  * Si se crea el campo identificador automáticamente será accesible desde la propiedad ''​id''​. 
 +  * El método ''​to_dict()''​ devuelve el objeto en formato diccionario.
 ==== Relaciones ==== ==== Relaciones ====
 Para indicar las relaciones entre clases\tablas utilizaremos las funciones ''​ManyToOne''​ y ''​OneToMany'',​ y ''​ManyToMany''​ según la cardinalidad:​ Para indicar las relaciones entre clases\tablas utilizaremos las funciones ''​ManyToOne''​ y ''​OneToMany'',​ y ''​ManyToMany''​ según la cardinalidad:​
Línea 266: Línea 295:
 ===== Consultas ===== ===== Consultas =====
 Aunque las consultas se basan en las de SQLAlchemy y podemos lanzar con ese formato Elixir también nos agiliza dicha tarea. Aunque las consultas se basan en las de SQLAlchemy y podemos lanzar con ese formato Elixir también nos agiliza dicha tarea.
- +  * [[http://​docs.sqlalchemy.org/​en/​rel_0_8/​orm/​tutorial.html#​common-filter-operators|Operadores]],​ deberemos importar sqlalchemy: ''​from sqlalchemy import desc''​.
 ==== Consultas básicas ==== ==== Consultas básicas ====
   * Recoger todos: ''​clase.query.all()''​   * Recoger todos: ''​clase.query.all()''​
Línea 280: Línea 308:
 Movie.query.filter(Movie.genres.any(name=u"​Horror"​)).all() Movie.query.filter(Movie.genres.any(name=u"​Horror"​)).all()
 </​code>​ </​code>​
 +
  
  
Línea 289: Línea 318:
 from sqlalchemy import desc from sqlalchemy import desc
 q.order_by(desc(Movie.year)).all() q.order_by(desc(Movie.year)).all()
 +</​code>​
 +==== Realizar un join ====
 +<code python>
 +PlayerAchievements.query.filter(PlayerAchievements.player == p).filter(PlayerAchievements.teamconfig == t).all()
 +</​code>​
 +==== Otros ====
 +=== Consultar por identificador ===
 +<code python>
 +e = Element.get(identifier)
 +</​code>​
 +=== Consultar una lista vacía ===
 +<code python>
 +vendors = Vendors.query.filter(~Vendors.items.any())
 +</​code>​
 +=== Lanzar código SQL directamente ===
 +<code python>
 +from elixir import *
 +for result in session.execute('​select * from people'​):​
 +     print result['​name'​]
 +</​code>​
 +<code python>
 +conn = metadata.bind.engine.connect()
 +conn.execute('​delete from css_actions'​)
 </​code>​ </​code>​
 ===== Avanzado ===== ===== Avanzado =====
Línea 297: Línea 349:
  
 ===== Notas ===== ===== Notas =====
 +
 +
 ==== Otros ==== ==== Otros ====
-  ​Podemos utilizar el tipo de campo ''​Enum''​ para hacer enumeraciones:+ 
 +  ​Ejecutar SQL al iniciar la aplicación:
 <code python> <code python>
-class MyStuff(Entity): +class MySetup: 
-    e = Field(Enum(u'foobar', u'baz', u'quux', ​None))+   def connect(self, dbapi_con, con_record): 
 +       dbapi_con.execute('alter session set NLS_SORT=BINARY_CI'
 +       ​dbapi_con.execute('alter session set NLS_COMP=LINGUISTIC'
 +engine = create_engine('oracle:...', ​listeners=[MySetup()]) 
 +elixir.metadata.bind = engine
 </​code>​ </​code>​
- 
fw/elixir.1312470524.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)