Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
fw:elixir [2011/08/04 15:11] 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 290: | 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> | </code> | ||
| ==== Otros ==== | ==== Otros ==== | ||
| + | === Consultar por identificador === | ||
| + | <code python> | ||
| + | e = Element.get(identifier) | ||
| + | </code> | ||
| === Consultar una lista vacía === | === Consultar una lista vacía === | ||
| <code python> | <code python> | ||
| Línea 302: | Línea 338: | ||
| print result['name'] | print result['name'] | ||
| </code> | </code> | ||
| + | <code python> | ||
| + | conn = metadata.bind.engine.connect() | ||
| + | conn.execute('delete from css_actions') | ||
| + | </code> | ||
| ===== Avanzado ===== | ===== Avanzado ===== | ||
| ==== Sesiones ==== | ==== Sesiones ==== | ||
| Línea 310: | 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> | ||
| - | |||