Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PSDI Army
yii2
Commits
51a17fae
Commit
51a17fae
authored
Dec 23, 2014
by
pana1990
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update db-dao.md in guide-es [skip ci]
parent
28fd9167
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
92 additions
and
92 deletions
+92
-92
db-dao.md
docs/guide-es/db-dao.md
+92
-92
No files found.
docs/guide-es/db-dao.md
View file @
51a17fae
...
@@ -3,11 +3,11 @@
...
@@ -3,11 +3,11 @@
> Nota: Esta sección está en desarrollo.
> Nota: Esta sección está en desarrollo.
Yii incluye una capa de acceso a bases de datos basado en el
[
PDO
](
http://php.net/manual/es/book.pdo.php
)
de PHP. La
Yii incluye una capa de acceso a bases de datos basado en el
[
PDO
](
http://php.net/manual/es/book.pdo.php
)
de PHP. La
interfaz de objetos de acceso a bases de datos (DAO) proporciona una API uniforme y soluciona algunas inconsistencias
interfaz de objetos de acceso a bases de datos (DAO) proporciona una API uniforme y soluciona algunas inconsistencias
que existen entre diferentes aplicaciones de bases de datos. Mientras el Active Record proporciona interacciones con
que existen entre diferentes aplicaciones de bases de datos. Mientras el Active Record proporciona interacciones con
los modelos, y el Constructor de Consultas (Query Builder) ayuda en la composición de consultas dinámicas, DAO es una
los modelos, y el Constructor de Consultas (Query Builder) ayuda en la composición de consultas dinámicas, DAO es una
manera simple y eficiente para ejecutar SQL en la base de datos. Por lo general, se usará DAO cuando la ejecución de
manera simple y eficiente para ejecutar SQL en la base de datos. Por lo general, se usará DAO cuando la ejecución de
la consulta sea muy costosa y/o no se requieran modelos de aplicación y sus correspondientes lógicas de negocio.
la consulta sea muy costosa y/o no se requieran modelos de aplicación y sus correspondientes lógicas de negocio.
De forma predeterminada, Yii soporta los siguientes DBMS (Sistemas de Gestión de Base de Datos):
De forma predeterminada, Yii soporta los siguientes DBMS (Sistemas de Gestión de Base de Datos):
...
@@ -16,17 +16,17 @@ De forma predeterminada, Yii soporta los siguientes DBMS (Sistemas de Gestión d
...
@@ -16,17 +16,17 @@ De forma predeterminada, Yii soporta los siguientes DBMS (Sistemas de Gestión d
-
[
MariaDB
](
https://mariadb.com/
)
-
[
MariaDB
](
https://mariadb.com/
)
-
[
SQLite
](
http://sqlite.org/
)
-
[
SQLite
](
http://sqlite.org/
)
-
[
PostgreSQL
](
http://www.postgresql.org/
)
-
[
PostgreSQL
](
http://www.postgresql.org/
)
-
[
CUBRID
](
http://www.cubrid.org/
)
: versión 9.3 o superior. (Tenga en cuenta que debido al
-
[
CUBRID
](
http://www.cubrid.org/
)
: versión 9.3 o superior. (Tenga en cuenta que debido al
[
bug
](
http://jira.cubrid.org/browse/APIS-658
)
en la extensión PDO de cubrid, los valores entrecomillados no
[
bug
](
http://jira.cubrid.org/browse/APIS-658
)
en la extensión PDO de cubrid, los valores entrecomillados no
funcionarán, por lo que se necesita CUBRID 9.3 tanto para el cliente como para el servidor)
funcionarán, por lo que se necesita CUBRID 9.3 tanto para el cliente como para el servidor)
-
[
Oracle
](
http://www.oracle.com/us/products/database/overview/index.html
)
-
[
Oracle
](
http://www.oracle.com/us/products/database/overview/index.html
)
-
[
MSSQL
](
https://www.microsoft.com/en-us/sqlserver/default.aspx
)
: versión 200
5
o superior.
-
[
MSSQL
](
https://www.microsoft.com/en-us/sqlserver/default.aspx
)
: versión 200
8
o superior.
Configuración
Configuración
-------------
-------------
Para empezar a interaccionar con la base de datos (usando DAO o de otra forma), se tiene que configurar el componente
Para empezar a interaccionar con la base de datos (usando DAO o de otra forma), se tiene que configurar el componente
de conexión a la base de datos de la aplicación. El DSN (Nombre de Origen de Datos) configura que aplicación de BBDD y
de conexión a la base de datos de la aplicación. El DSN (Nombre de Origen de Datos) configura que aplicación de BBDD y
que BBDD especifica debe conectar la aplicación:
que BBDD especifica debe conectar la aplicación:
```
php
```
php
...
@@ -53,11 +53,11 @@ return [
...
@@ -53,11 +53,11 @@ return [
];
];
```
```
Se puede encontrar más información del formato de la cadena DSN en el
Se puede encontrar más información del formato de la cadena DSN en el
[
manual de PHP
](
http://php.net/manual/es/pdo.construct.php
)
. Además se puede encontrar el listado completo de
[
manual de PHP
](
http://php.net/manual/es/pdo.construct.php
)
. Además se puede encontrar el listado completo de
propiedades que se pueden configurar en la clase en
[
[yii\db\Connection
]
].
propiedades que se pueden configurar en la clase en
[
[yii\db\Connection
]
].
Hay que tener en cuenta que si se conecta a una base de datos mediante ODBC, se debe configurar la propiedad
Hay que tener en cuenta que si se conecta a una base de datos mediante ODBC, se debe configurar la propiedad
[
[yii\db\Connection::driverName
]
] para que Yii sepa el tipo de bases de datos actual. Por ejemplo,
[
[yii\db\Connection::driverName
]
] para que Yii sepa el tipo de bases de datos actual. Por ejemplo,
```
php
```
php
...
@@ -70,8 +70,8 @@ Hay que tener en cuenta que si se conecta a una base de datos mediante ODBC, se
...
@@ -70,8 +70,8 @@ Hay que tener en cuenta que si se conecta a una base de datos mediante ODBC, se
],
],
```
```
Se puede acceder a la conexión
`db`
primaria mediante la expresión
`\Yii::$app->db`
. También se pueden configurar
Se puede acceder a la conexión
`db`
primaria mediante la expresión
`\Yii::$app->db`
. También se pueden configurar
múltiples conexiones de BBDD en una única aplicación. Simplemente asignándoles diferentes IDs en la configuración de
múltiples conexiones de BBDD en una única aplicación. Simplemente asignándoles diferentes IDs en la configuración de
la aplicación:
la aplicación:
```
php
```
php
...
@@ -81,14 +81,14 @@ return [
...
@@ -81,14 +81,14 @@ return [
// ...
// ...
'db'
=>
[
'db'
=>
[
'class'
=>
'yii\db\Connection'
,
'class'
=>
'yii\db\Connection'
,
'dsn'
=>
'mysql:host=localhost;dbname=mydatabase'
,
'dsn'
=>
'mysql:host=localhost;dbname=mydatabase'
,
'username'
=>
'root'
,
'username'
=>
'root'
,
'password'
=>
''
,
'password'
=>
''
,
'charset'
=>
'utf8'
,
'charset'
=>
'utf8'
,
],
],
'secondDb'
=>
[
'secondDb'
=>
[
'class'
=>
'yii\db\Connection'
,
'class'
=>
'yii\db\Connection'
,
'dsn'
=>
'sqlite:/path/to/database/file'
,
'dsn'
=>
'sqlite:/path/to/database/file'
,
],
],
],
],
// ...
// ...
...
@@ -102,7 +102,7 @@ $primaryConnection = \Yii::$app->db;
...
@@ -102,7 +102,7 @@ $primaryConnection = \Yii::$app->db;
$secondaryConnection
=
\Yii
::
$app
->
secondDb
;
$secondaryConnection
=
\Yii
::
$app
->
secondDb
;
```
```
Si no se quiere definir la conexión como un
[
componente de aplicación
](
structure-application-components.md
)
, se puede
Si no se quiere definir la conexión como un
[
componente de aplicación
](
structure-application-components.md
)
, se puede
instanciar directamente:
instanciar directamente:
```
php
```
php
...
@@ -114,8 +114,8 @@ $connection = new \yii\db\Connection([
...
@@ -114,8 +114,8 @@ $connection = new \yii\db\Connection([
$connection
->
open
();
$connection
->
open
();
```
```
>
Tip: Si se necesita ejecutar una consulta SQL inmediatamente después de establecer la conexión
>
Consejo: Si se necesita ejecutar una consulta SQL inmediatamente después de establecer la conexión
(
p. ej. para establecer la zona horaria (timezone) o juego de caracteres), se puede añadir el siguiente código en el
(
ej. para establecer la zona horaria (timezone) o el juego de caracteres), se puede añadir el siguiente código en el
archivo de configuración de la aplicación:
archivo de configuración de la aplicación:
>
>
```
php
```
php
...
@@ -135,7 +135,7 @@ return [
...
@@ -135,7 +135,7 @@ return [
];
];
```
```
Ejecución de Consultas SQL B
a
sicas
Ejecución de Consultas SQL B
á
sicas
----------------------------------
----------------------------------
Una vez instanciada una conexión a la base de datos, se pueden ejecutar consultas SQL usando
[
[yii\db\Command
]
].
Una vez instanciada una conexión a la base de datos, se pueden ejecutar consultas SQL usando
[
[yii\db\Command
]
].
...
@@ -179,8 +179,8 @@ $command = $connection->createCommand('UPDATE post SET status=1 WHERE id=1');
...
@@ -179,8 +179,8 @@ $command = $connection->createCommand('UPDATE post SET status=1 WHERE id=1');
$command
->
execute
();
$command
->
execute
();
```
```
De forma alternativa, se pueden usar los métodos
`insert`
,
`update`
, y
`delete`
. Estos métodos se encargarán de
De forma alternativa, se pueden usar los métodos
`insert`
,
`update`
, y
`delete`
. Estos métodos se encargarán de
gestionar e
ntrecomillar adecuadamente el nombre de la tabla y de las columnas que se usen en la consulta, y solo se
gestionar e
l entrecomillado de los nombres de la tablas y de las columnas que se usen en la consulta, y solo se
tendrá que proporcionar los valores necesarios.
tendrá que proporcionar los valores necesarios.
[
[Se tiene que poner el enlace de documentación aquí.
]
]
[
[Se tiene que poner el enlace de documentación aquí.
]
]
...
@@ -206,10 +206,10 @@ $connection->createCommand()->update('user', ['status' => 1], 'age > 30')->execu
...
@@ -206,10 +206,10 @@ $connection->createCommand()->update('user', ['status' => 1], 'age > 30')->execu
$connection
->
createCommand
()
->
delete
(
'user'
,
'status = 0'
)
->
execute
();
$connection
->
createCommand
()
->
delete
(
'user'
,
'status = 0'
)
->
execute
();
```
```
Entrecomillado de
Nombre de Tablas y Columnas
Entrecomillado de
los Nombres de las Tablas y las Columnas <a name="quoting-table-and-column-names"></a>
---------------------------------------------
---------------------------------------------
-------------
Para hacer que los nombres de
columnas y tablas sean seguros para usarse en consultas, se puede utilizar Yii
Para hacer que los nombres de
las columnas y las tablas sean seguros para usarse en las consultas, se puede utilizar Yii
adecuadamente para que los entrecomille:
adecuadamente para que los entrecomille:
```
php
```
php
...
@@ -217,10 +217,10 @@ $sql = "SELECT COUNT([[$column]]) FROM {{table}}";
...
@@ -217,10 +217,10 @@ $sql = "SELECT COUNT([[$column]]) FROM {{table}}";
$rowCount
=
$connection
->
createCommand
(
$sql
)
->
queryScalar
();
$rowCount
=
$connection
->
createCommand
(
$sql
)
->
queryScalar
();
```
```
En el código anterior, se convertirá
`[[$column]]`
a un nombre de columna debidamente entrecomillado, mientras que se
En el código anterior, se convertirá
`[[$column]]`
a un nombre de columna debidamente entrecomillado, mientras que se
convertirá
`{{table}}`
a un nombre de tabla debidamente entrecomillado.
convertirá
`{{table}}`
a un nombre de tabla debidamente entrecomillado.
Hay una variante especial de esta sintaxis especifica para que los nombres de
tablas:
`{{%Y}}`
añade automáticamente
Hay una variante especial de esta sintaxis especifica para que los nombres de
las tablas:
`{{%Y}}`
añade automáticamente
el prefijo de la tabla de la aplicación para proporcionar un valor, si se ha establecido un prefijo de tabla:
el prefijo de la tabla de la aplicación para proporcionar un valor, si se ha establecido un prefijo de tabla:
```
php
```
php
...
@@ -228,7 +228,7 @@ $sql = "SELECT COUNT([[$column]]) FROM {{%table}}";
...
@@ -228,7 +228,7 @@ $sql = "SELECT COUNT([[$column]]) FROM {{%table}}";
$rowCount
=
$connection
->
createCommand
(
$sql
)
->
queryScalar
();
$rowCount
=
$connection
->
createCommand
(
$sql
)
->
queryScalar
();
```
```
El código anterior dará como resultado una consulta de selección de la tabla
`tbl_table`
, si se tiene el prefijo de
El código anterior dará como resultado una consulta de selección de la tabla
`tbl_table`
, si se tiene el prefijo de
tabla configurado como el siguiente:
tabla configurado como el siguiente:
```
php
```
php
...
@@ -244,7 +244,7 @@ return [
...
@@ -244,7 +244,7 @@ return [
];
];
```
```
La alternativa es entrecomillar los nombres de
tabla y columna manualmente usando
La alternativa es entrecomillar los nombres de
las tablas y las columnas manualmente usando
[
[yii\db\Connection::quoteTableName()]] y [[yii\db\Connection::quoteColumnName()]
]:
[
[yii\db\Connection::quoteTableName()]] y [[yii\db\Connection::quoteColumnName()]
]:
```php
```php
...
@@ -257,8 +257,8 @@ $rowCount = $connection->createCommand($sql)->queryScalar();
...
@@ -257,8 +257,8 @@ $rowCount = $connection->createCommand($sql)->queryScalar();
Uso de Sentencias Preparadas
Uso de Sentencias Preparadas
----------------------------
----------------------------
Para pasar parámetros seguros a las consultas, se deben usar las sentencias preparadas. Primero, se tiene que crear un
Para pasar parámetros seguros a las consultas, se deben usar las sentencias preparadas. Primero, se tiene que crear un
*parámetro de substitución* (placeholder) en una consulta (usando la sintaxis `:placeholder`). Después intercambiar el
*parámetro de substitución* (placeholder) en una consulta (usando la sintaxis `:placeholder`). Después intercambiar el
parámetro de substitución por una variable y ejecutar la consulta:
parámetro de substitución por una variable y ejecutar la consulta:
```
php
```
php
...
@@ -267,7 +267,7 @@ $command->bindValue(':id', $_GET['id']);
...
@@ -267,7 +267,7 @@ $command->bindValue(':id', $_GET['id']);
$post = $command->queryOne();
$post = $command->queryOne();
```
```
Otra finalidad de las sentencias preparadas (aparte de mejorar la seguridad) es la habilidad de ejecutar una consulta
Otra finalidad de las sentencias preparadas (aparte de mejorar la seguridad) es la habilidad de ejecutar una consulta
múltiples veces mientras que sólo se ha preparado una vez:
múltiples veces mientras que sólo se ha preparado una vez:
```
php
```
php
...
@@ -281,17 +281,17 @@ $id = 2;
...
@@ -281,17 +281,17 @@ $id = 2;
$command->execute();
$command->execute();
```
```
Tenga en cuenta que se efectúa la asignación del parámetro de substitución antes de su ejecución, y después se cambia
Tenga en cuenta que se efectúa la asignación del parámetro de substitución antes de su ejecución, y después se cambia
el valor antes de la siguiente ejecución (normalmente se ejecuta en bucles). La ejecución de consultas con este
el valor antes de la siguiente ejecución (normalmente se ejecuta en bucles). La ejecución de consultas con este
método, puede ser mucho más eficiente que la ejecución de una consulta cada vez.
método, puede ser mucho más eficiente que la ejecución de una consulta cada vez.
Realización de Transacciones
Realización de Transacciones
----------------------------
----------------------------
Cuando se ejecutan múltiples, consultas relacionadas en una secuencia, puede que se tengan que envolver en una
Cuando se ejecutan múltiples, consultas relacionadas en una secuencia, puede que se tengan que envolver en una
transacción para proteger la integridad de los datos. Las transacciones permiten escribir una serie de consultas de
transacción para proteger la integridad de los datos. Las transacciones permiten escribir una serie de consultas de
forma que o todas se ejecutan correctamente o no tendrán ningún efecto. Yii proporciona una interfaz sencilla para
forma que o todas se ejecutan correctamente o no tendrán ningún efecto. Yii proporciona una interfaz sencilla para
trabajar con transacciones en casos simples pero también para el uso avanzado cuando tengan que definir los niveles de
trabajar con transacciones en casos simples pero también para el uso avanzado cuando tengan que definir los niveles de
aislamiento.
aislamiento.
El siguiente código muestra un patrón simple que debe seguir todo código que utilice consultas transaccionales:
El siguiente código muestra un patrón simple que debe seguir todo código que utilice consultas transaccionales:
...
@@ -309,13 +309,13 @@ try {
...
@@ -309,13 +309,13 @@ try {
}
}
```
```
La primera linea empieza una nueva transacción usando el método
La primera linea empieza una nueva transacción usando el método
[[yii\db\Connection::beginTransaction()|beginTransaction()]] del objeto de conexión a la base de datos. La transacción
[[yii\db\Connection::beginTransaction()|beginTransaction()]] del objeto de conexión a la base de datos. La transacción
en si misma se representa con el objeto [[yii\db\Transaction]] almacenado en `$transaction`. Nosotros encapsulamos la
en si misma se representa con el objeto [[yii\db\Transaction]] almacenado en `$transaction`. Nosotros encapsulamos la
ejecución de todas las consultas en un bloque try-catch para poder gestionar los errores. Llamamos a
ejecución de todas las consultas en un bloque try-catch para poder gestionar los errores. Llamamos a
[[yii\db\Transaction::commit()|commit()]] cuando todo es correcto para efectuar la transacción y si sucede algún error
[[yii\db\Transaction::commit()|commit()]] cuando todo es correcto para efectuar la transacción y si sucede algún error
ejecutamos [[yii\db\Transaction::rollBack()|rollBack()]]. Esto revertirá el efecto de todas las consultas que se hayan
ejecutamos [[yii\db\Transaction::rollBack()|rollBack()]]. Esto revertirá el efecto de todas las consultas que se hayan
ejecutado dentro de la transacción. Se usa `throw $e` para relanzar la excepción en caso de que nosotros no podamos
ejecutado dentro de la transacción. Se usa `throw $e` para relanzar la excepción en caso de que nosotros no podamos
gestionar el error y se delega a otro código del gestor de errores de Yii.
gestionar el error y se delega a otro código del gestor de errores de Yii.
Es posible anidar múltiples transacciones si es necesario:
Es posible anidar múltiples transacciones si es necesario:
...
@@ -341,13 +341,13 @@ try {
...
@@ -341,13 +341,13 @@ try {
}
}
```
```
Tenga en cuanta que el DBMS debe soportar Puntos de Registro (Savepoints) para que funcionen correctamente. El código
Tenga en cuanta que el DBMS debe soportar Puntos de Registro (Savepoints) para que funcionen correctamente. El código
anterior, trabajará con cualquier DBMS pero
las sólo se garantizarán las transacciones que se ejecuten bajo un DBMS
anterior, trabajará con cualquier DBMS pero
sólo se garantizarán las transacciones que se ejecuten bajo un DBMS
que las soporte.
que las soporte.
Yii también soporta la configuración de [niveles de aislamiento] en las transacciones. Cuando empiece una transacción
Yii también soporta la configuración de [niveles de aislamiento] en las transacciones. Cuando empiece una transacción
se ejecutará con el nivel predeterminado de aislamiento definido por la base de datos. Se puede especificar un nivel
se ejecutará con el nivel predeterminado de aislamiento definido por la base de datos. Se puede especificar un nivel
de aislamiento espec
i
fico cuando se empieza una transacción:
de aislamiento espec
í
fico cuando se empieza una transacción:
```
php
```
php
$transaction = $connection->beginTransaction(
\y
ii
\d
b
\T
ransaction::REPEATABLE_READ);
$transaction = $connection->beginTransaction(
\y
ii
\d
b
\T
ransaction::REPEATABLE_READ);
...
@@ -355,41 +355,41 @@ $transaction = $connection->beginTransaction(\yii\db\Transaction::REPEATABLE_REA
...
@@ -355,41 +355,41 @@ $transaction = $connection->beginTransaction(\yii\db\Transaction::REPEATABLE_REA
Yii proporciona cuatro constantes para los niveles de aislamiento más comunes:
Yii proporciona cuatro constantes para los niveles de aislamiento más comunes:
- [[\yii\db\Transaction::READ_UNCOMMITTED]] - el nivel más bajo, pueden ocurrir lecturas Dirty, lecturas
- [[\yii\db\Transaction::READ_UNCOMMITTED]] - el nivel más bajo, pueden ocurrir lecturas Dirty, lecturas
Non-repeatable y Phantoms.
Non-repeatable y Phantoms.
- [[\yii\db\Transaction::READ_COMMITTED]] - evita lecturas Dirty.
- [[\yii\db\Transaction::READ_COMMITTED]] - evita lecturas Dirty.
- [[\yii\db\Transaction::REPEATABLE_READ]] - evita lecturas Dirty y lecturas Non-repeatable.
- [[\yii\db\Transaction::REPEATABLE_READ]] - evita lecturas Dirty y lecturas Non-repeatable.
- [[\yii\db\Transaction::SERIALIZABLE]] - el nivel más fuerte, evita todos los problemas nombrados anteriormente.
- [[\yii\db\Transaction::SERIALIZABLE]] - el nivel más fuerte, evita todos los problemas nombrados anteriormente.
Se pueden usar las constantes descritas anteriormente aunque también se pueden usar cadenas de texto que representen
Se pueden usar las constantes descritas anteriormente aunque también se pueden usar cadenas de texto que representen
la sintaxis que puede ser utilizada en el DBMS seguido de `SET TRANSACTION ISOLATION LEVEL`. Para postgres podría
la sintaxis que puede ser utilizada en el DBMS seguido de `SET TRANSACTION ISOLATION LEVEL`. Para postgres podría
utilizarse, por ejemplo, `SERIALIZABLE READ ONLY DEFERRABLE`.
utilizarse, por ejemplo, `SERIALIZABLE READ ONLY DEFERRABLE`.
Tenga en cuenta que algunos DBMS permiten configuraciones de niveles de aislamiento solo a nivel de conexión y por
Tenga en cuenta que algunos DBMS permiten configuraciones de niveles de aislamiento solo a nivel de conexión y por
consiguiente las transacciones pueden obtener el mismo nivel de aislamiento incluso si no se especifica ninguno.
consiguiente las transacciones pueden obtener el mismo nivel de aislamiento incluso si no se especifica ninguno.
Cuando se usa esta característica, se puede tener que establecer el nivel de aislamiento explícitamente para evitar
Cuando se usa esta característica, se puede tener que establecer el nivel de aislamiento explícitamente para evitar
conflictos de configuración. En este momento se ven afectados los DBMS MSSQL y SQLite.
conflictos de configuración. En este momento se ven afectados los DBMS MSSQL y SQLite.
> NOTA: SQLite solo soporta dos niveles de aislamiento, por lo que solo se puede usar `READ UNCOMMITTED` y
> NOTA: SQLite solo soporta dos niveles de aislamiento, por lo que solo se puede usar `READ UNCOMMITTED` y
`SERIALIZABLE`. El uso de otros niveles causará el lanzamiento de una excepción.
`SERIALIZABLE`. El uso de otros niveles causará el lanzamiento de una excepción.
> Nota: PostgreSQL no permite configurar el nivel de aislamiento antes que la transacción empiece por lo que no se
> Nota: PostgreSQL no permite configurar el nivel de aislamiento antes que la transacción empiece por lo que no se
puede especificar el nivel de aislamiento directamente cuando empieza la transacción. Se tiene que ejecutar
puede especificar el nivel de aislamiento directamente cuando empieza la transacción. Se tiene que ejecutar
[[yii\db\Transaction::setIsolationLevel()]] después de que la transacción haya empezado.
[[yii\db\Transaction::setIsolationLevel()]] después de que la transacción haya empezado.
[isolation levels]: http://en.wikipedia.org/wiki/Isolation_%28database_systems%29#Isolation_levels
[isolation levels]: http://en.wikipedia.org/wiki/Isolation_%28database_systems%29#Isolation_levels
R
e
plicas y División Lectura-Escritura
R
é
plicas y División Lectura-Escritura
-------------------------------------
-------------------------------------
Muchos DBMS soportan
Muchos DBMS soportan
[replicación de bases de datos](http://en.wikipedia.org/wiki/Replication_(computing)#Database_replication) para tener
[replicación de bases de datos](http://en.wikipedia.org/wiki/Replication_(computing)#Database_replication) para tener
una mejor disponibilidad de la base de datos y un mejor tiempo de respuesta del servidor. Con la replicación de bases
una mejor disponibilidad de la base de datos y un mejor tiempo de respuesta del servidor. Con la replicación de bases
de datos, los datos están replicados en los llamados *servidores maestros* (master servers) y *servidores esclavos*
de datos, los datos están replicados en los llamados *servidores maestros* (master servers) y *servidores esclavos*
(slave servers). Todas las escrituras y actualizaciones deben hacerse en el servidor maestro mientras que las lecturas
(slave servers). Todas las escrituras y actualizaciones deben hacerse en el servidor maestro mientras que las lecturas
se efectuarán en los servidores esclavos.
se efectuarán en los servidores esclavos.
Para aprovechar las ventajas de la replicación de BBDD y lograr una división de lecuta-escritura, se puede configurar
Para aprovechar las ventajas de la replicación de BBDD y lograr una división de lecuta-escritura, se puede configurar
el componente [[yii\db\Connection]] como se muestra a continuación:
el componente [[yii\db\Connection]] como se muestra a continuación:
```
php
```
php
...
@@ -406,7 +406,7 @@ el componente [[yii\db\Connection]] como se muestra a continuación:
...
@@ -406,7 +406,7 @@ el componente [[yii\db\Connection]] como se muestra a continuación:
'username' => 'slave',
'username' => 'slave',
'password' => '',
'password' => '',
'attributes' => [
'attributes' => [
// u
se a smaller connection timeout
// u
tiliza un tiempo de espera de conexión más pequeña
PDO::ATTR_TIMEOUT => 10,
PDO::ATTR_TIMEOUT => 10,
],
],
],
],
...
@@ -421,8 +421,8 @@ el componente [[yii\db\Connection]] como se muestra a continuación:
...
@@ -421,8 +421,8 @@ el componente [[yii\db\Connection]] como se muestra a continuación:
]
]
```
```
La configuración anterior especifica una configuración con un único maestro y múltiples esclavos. Uno de los esclavos
La configuración anterior especifica una configuración con un único maestro y múltiples esclavos. Uno de los esclavos
se conectará y se usará para ejecutar consultas de lectura mientras que el maestro se usar
a para realizar consultas de
se conectará y se usará para ejecutar consultas de lectura mientras que el maestro se usar
á para realizar consultas de
escritura. De este modo la división de lectura-escritura se logra automáticamente con esta configuración, Por ejemplo,
escritura. De este modo la división de lectura-escritura se logra automáticamente con esta configuración, Por ejemplo,
```
php
```
php
...
@@ -436,19 +436,19 @@ $rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();
...
@@ -436,19 +436,19 @@ $rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();
$db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
$db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
```
```
> Información: Las consultas realizadas ejecutando [[yii\db\Command::execute()]] se consideran consultas de escritura,
> Información: Las consultas realizadas ejecutando [[yii\db\Command::execute()]] se consideran consultas de escritura,
mientras que todas las demás se ejecutan mediante alguno de los métodos "query" de [[yii\db\Command]] son consultas
mientras que todas las demás se ejecutan mediante alguno de los métodos "query" de [[yii\db\Command]] son consultas
de lectura. Se puede obtener la conexión de esclavo activa mediante `$db->slave`.
de lectura. Se puede obtener la conexión de esclavo activa mediante `$db->slave`.
El componente `Connection` soporta el balanceo de carga y la conmutación de errores entre esclavos. Cuando se realiza
El componente `Connection` soporta el balanceo de carga y la conmutación de errores entre esclavos. Cuando se realiza
una consulta de lectura por primera vez, el componente `Connection` elegirá un esclavo aleatorio e intentará realizar
una consulta de lectura por primera vez, el componente `Connection` elegirá un esclavo aleatorio e intentará realizar
una conexión a este. Si está "muerto", se intentar
a con otro. Si no está disponible ningún esclavo, se conectará al
una conexión a este. Si está "muerto", se intentar
á con otro. Si no está disponible ningún esclavo, se conectará al
maestro. Configurando una [[yii\db\Connection::serverStatusCache|server status cache]], se recordarán los servidores
maestro. Configurando una [[yii\db\Connection::serverStatusCache|server status cache]], se recordarán los servidores
"muertos" por lo que no se intentará volver a conectar a ellos durante
"muertos" por lo que no se intentará volver a conectar a ellos durante
[[yii\db\Connection::serverRetryInterval|certain period of time]].
[[yii\db\Connection::serverRetryInterval|certain period of time]].
> Información: En la configuración anterior, se especifica un tiempo de espera (timeout) de conexión de 10 segundos
> Información: En la configuración anterior, se especifica un tiempo de espera (timeout) de conexión de 10 segundos
para cada esclavo. Esto significa que si no se puede conectar a un esclavo en 10 segundos, este será considerado
para cada esclavo. Esto significa que si no se puede conectar a un esclavo en 10 segundos, este será considerado
como "muerto". Se puede ajustar el parámetro basado en el entorno actual.
como "muerto". Se puede ajustar el parámetro basado en el entorno actual.
También se pueden configurar múltiples parámetros para múltiples esclavos. Por ejemplo,
También se pueden configurar múltiples parámetros para múltiples esclavos. Por ejemplo,
...
@@ -462,7 +462,7 @@ También se pueden configurar múltiples parámetros para múltiples esclavos. P
...
@@ -462,7 +462,7 @@ También se pueden configurar múltiples parámetros para múltiples esclavos. P
'username' => 'master',
'username' => 'master',
'password' => '',
'password' => '',
'attributes' => [
'attributes' => [
// u
se a smaller connection timeout
// u
tilizar un tiempo de espera de conexión más pequeña
PDO::ATTR_TIMEOUT => 10,
PDO::ATTR_TIMEOUT => 10,
],
],
],
],
...
@@ -478,7 +478,7 @@ También se pueden configurar múltiples parámetros para múltiples esclavos. P
...
@@ -478,7 +478,7 @@ También se pueden configurar múltiples parámetros para múltiples esclavos. P
'username' => 'slave',
'username' => 'slave',
'password' => '',
'password' => '',
'attributes' => [
'attributes' => [
// u
se a smaller connection timeout
// u
tilizar un tiempo de espera de conexión más pequeña
PDO::ATTR_TIMEOUT => 10,
PDO::ATTR_TIMEOUT => 10,
],
],
],
],
...
@@ -493,15 +493,15 @@ También se pueden configurar múltiples parámetros para múltiples esclavos. P
...
@@ -493,15 +493,15 @@ También se pueden configurar múltiples parámetros para múltiples esclavos. P
]
]
```
```
La configuración anterior especifica dos maestros y cuatro esclavos. El componente `Connection` también da soporte al
La configuración anterior especifica dos maestros y cuatro esclavos. El componente `Connection` también da soporte al
balanceo de carga y la conmutación de errores entre maestros igual que hace con los esclavos. La diferencia es que
balanceo de carga y la conmutación de errores entre maestros igual que hace con los esclavos. La diferencia es que
cuando no se encuentra ningún maestro disponible se lanza una excepción.
cuando no se encuentra ningún maestro disponible se lanza una excepción.
> Nota: cuando se usa la propiedad [[yii\db\Connection::masters|masters]] para configurar uno o múltiples maestros, se
> Nota: cuando se usa la propiedad [[yii\db\Connection::masters|masters]] para configurar uno o múltiples maestros, se
ignorarán todas las otras propiedades que especifiquen una conexión de base de datos
ignorarán todas las otras propiedades que especifiquen una conexión de base de datos
(
p.
ej. `dsn`, `username`, `password`), junto con el mismo objeto `Connection`.
(ej. `dsn`, `username`, `password`), junto con el mismo objeto `Connection`.
Las conexiones usan la conexión de maestro de forma predeterminada. Y todas las operaciones de BBDD que estén dentro
Las conexiones usan la conexión de maestro de forma predeterminada. Y todas las operaciones de BBDD que estén dentro
de una transacción, usaran la conexión de maestro. Por ejemplo,
de una transacción, usaran la conexión de maestro. Por ejemplo,
```
php
```
php
...
@@ -520,14 +520,14 @@ try {
...
@@ -520,14 +520,14 @@ try {
}
}
```
```
Si se quiere empezar la conexión con una conexión a un esclavo, se debe hacer explícitamente como se muestra a
Si se quiere empezar la conexión con una conexión a un esclavo, se debe hacer explícitamente como se muestra a
continuación:
continuación:
```
php
```
php
$transaction = $db->slave->beginTransaction();
$transaction = $db->slave->beginTransaction();
```
```
A veces, se puede querer forzar el uso de una conexión maestra para realizar una consulta de lectura. Se puede lograr
A veces, se puede querer forzar el uso de una conexión maestra para realizar una consulta de lectura. Se puede lograr
usando el método `useMaster()`:
usando el método `useMaster()`:
```
php
```
php
...
@@ -536,7 +536,7 @@ $rows = $db->useMaster(function ($db) {
...
@@ -536,7 +536,7 @@ $rows = $db->useMaster(function ($db) {
});
});
```
```
También se puede utilizar directamente estableciendo `$db->enableSlaves` a `false` para que se redirijan todas las
También se puede utilizar directamente estableciendo `$db->enableSlaves` a `false` para que se redirijan todas las
consultas a la conexión de maestro.
consultas a la conexión de maestro.
Trabajar con Esquemas de Bases de Datos
Trabajar con Esquemas de Bases de Datos
...
@@ -560,7 +560,7 @@ Para hacer referencia al esquema entero, se puede revisar [[yii\db\Schema]].
...
@@ -560,7 +560,7 @@ Para hacer referencia al esquema entero, se puede revisar [[yii\db\Schema]].
### Modificación de esquemas
### Modificación de esquemas
Aparte de consultas SQL b
asicas, [[yii\db\Command]] contiene un conjunto de métodos que permiten modificar el esquema
Aparte de consultas SQL b
ásicas, [[yii\db\Command]] contiene un conjunto de métodos que permiten modificar el esquema
de la base de datos:
de la base de datos:
- createTable, renameTable, dropTable, truncateTable
- createTable, renameTable, dropTable, truncateTable
...
@@ -572,7 +572,7 @@ de la base de datos:
...
@@ -572,7 +572,7 @@ de la base de datos:
Que pueden usarse como se muestra a continuación:
Que pueden usarse como se muestra a continuación:
```
php
```
php
// CREA
TE TABLE
// CREA
R TABLA
$connection->createCommand()->createTable('post',
[
$connection->createCommand()->createTable('post',
[
'id' => 'pk',
'id' => 'pk',
'title' => 'string',
'title' => 'string',
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment