mysqldump -u root -p maBase > maBase_backup.sql
On aura au préalable coché les commandes de destruction de l'ancienne base lors de l'exportation de la base.
mysql -h #serveur# -u #username# -p #database# < #dump_file#
Mots de passe dans: my.cnf
On arrête mysql :
# /etc/init.d/mysql stop
On le relance sans les droits d'utilisateur :
# mysqld --skip-grant-tables &
On lance le client mysql en ligne de commande :
# mysql -u root
On fait les modifs nécessaires et on quitte le client. On arrête mysql :
# killall mysqld
On le relance normalement :
# /etc/init.d/mysql start
Permet de pouvoir faire des scripts de migration fiables puisque les noms de clé et d'index seront les mêmes sur tout les serveurs.
<?php /** * Migration qui ajoute les colonne permettant d'effectuer la localisation * d'un membre comme les bars. */ class Migration024 extends sfMigration { /** * Up */ public function up() { $this->diag('Debut UP 24'); // Table user_profile $this->diag('MAJ champs user_profile'); $this->executeSQL(" ALTER TABLE `user_profile` ADD `country_code` varchar(2) default NULL COMMENT 'Code du pays' AFTER `personal_url` , ADD `zone_id` int(11) default NULL COMMENT 'Departement du membre' AFTER `country_code` , ADD `lat` decimal(12,9) default NULL COMMENT 'Latitude' AFTER `zone_id` , ADD `lng` decimal(12,9) default NULL COMMENT 'Longitude' AFTER `lat` , ADD `latlng_precision` int( 11 ) default NULL COMMENT 'Precision de la localisation' AFTER `lng`; "); // ALTER TABLE `user_profile` ADD FOREIGN KEY ( `zone_id` ) REFERENCES `zone` (`id`) ON DELETE SET NULL; // Ajout des cle etrangeres $this->diag('MAJ contraintes user_profile'); $this->executeSQL(" ALTER TABLE `user_profile` ADD CONSTRAINT `zone_id_FK` FOREIGN KEY `zone_id_idx` ( `zone_id` ) REFERENCES `zone` (`id`) ON DELETE SET NULL; "); } /** * Down */ public function down() { $this->diag('Debut DOWN 24'); // Suppr $this->diag('SUPPRESSION contraintes champs a supprimer'); $this->executeSQL(" ALTER TABLE `user_profile` DROP FOREIGN KEY `zone_id_FK` "); $this->executeSQL(" DROP INDEX `zone_id_idx` ON `user_profile` "); $this->diag('SUPPRESSION champs user_profile'); $this->executeSQL(" ALTER TABLE `user_profile` DROP `country_code`, DROP `zone_id`, DROP `lat`, DROP `lng`, DROP `town`, DROP `latlng_precision`; "); } }
Ou en décomposant la création des index/clés
<?php /** * Migration qui ajoute les colonne permettant d'effectuer la localisation * d'un membre comme les bars. */ class Migration024 extends sfMigration { /** * Up */ public function up() { $this->diag('Debut UP 24'); // Table am_user_profile $this->diag('MAJ champs user_profile'); $this->executeSQL(" ALTER TABLE `user_profile` ADD `country_code` varchar(2) default NULL COMMENT 'Code du pays' AFTER `personal_url` , ADD `lat` decimal(12,9) default NULL COMMENT 'Latitude' AFTER `country_code` , ADD `lng` decimal(12,9) default NULL COMMENT 'Longitude' AFTER `lat` , ADD `latlng_precision` int( 11 ) default NULL COMMENT 'Precision de la localisation' AFTER `lng`; "); // ALTER TABLE `am_user_profile` ADD FOREIGN KEY ( `zone_id` ) REFERENCES `am_zone` (`id`) ON DELETE SET NULL; // Ajout des cle etrangeres /* $this->diag('MAJ conrtaintes am_user_profile'); $this->executeSQL(" ALTER TABLE `user_profile` ADD CONSTRAINT `zone_id_FK` FOREIGN KEY `zone_id_idx` ( `zone_id` ) REFERENCES `am_zone` (`id`) ON DELETE SET NULL; "); */ $this->diag('CREATION table am_user_zone'); $this->executeSQL(" CREATE TABLE `user_zone` ( `id` int(11) NOT NULL auto_increment, `user_id` int(11) NOT NULL, `zone_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; "); /* KEY `user_zone_FI_1` (`user_id`), KEY `user_zone_FI_2` (`zone_id`) ALTER TABLE `user_zone` ADD INDEX ( `user_id` ) */ $this->diag('MAJ conrtaintes am_user_zone'); $this->executeSQL(" ALTER TABLE `user_zone` ADD INDEX `user_zone_FI_1` ( `user_id` ) "); $this->executeSQL(" ALTER TABLE `user_zone` ADD FOREIGN KEY `user_zone_FK_1` ( `user_id` ) REFERENCES `sf_guard_user` (`id` ) ON DELETE CASCADE; "); $this->executeSQL(" ALTER TABLE `user_zone` ADD INDEX `am_user_zone_FI_2` ( `zone_id` ) "); $this->executeSQL(" ALTER TABLE `user_zone` ADD FOREIGN KEY `user_zone_FK_2` ( `zone_id` ) REFERENCES `zone` (`id` ) ON DELETE CASCADE; "); } /** * Down */ public function down() { $this->diag('Debut DOWN 24'); // Suppr $this->diag('SUPPRESSION contraintes champs a supprimer'); /* $this->executeSQL(" ALTER TABLE `user_profile` DROP FOREIGN KEY `zone_id_FK` "); $this->executeSQL(" DROP INDEX `zone_id_idx` ON `user_profile` "); */ $this->diag('SUPPRESSION champs user_profile'); $this->executeSQL(" ALTER TABLE `user_profile` DROP `country_code`, DROP `lat`, DROP `lng`, DROP `latlng_precision`; "); $this->diag('SUPPRESSION table user_zone'); $this->executeSQL("DROP TABLE IF EXISTS `user_zone`"); } }
all:
connexion1:
class: sfPropelDatabase
param:
dsn: mysql://root:password@localhost/db1
connexion2:
class: sfPropelDatabase
param:
dsn: mysql://root:password@localhost/db2
Après tu peux instancier une connection depuis propel :
$con1 = Propel::getConnection('connexion1'); $con2 = Propel::getConnection('connexion2');
$criterion = $c->getNewCriterion(self::RESPONSE_CODE, null, Criteria::ISNOTNULL) ->addAnd($c->getNewCriterion(self::RESPONSE_CODE, 0)); $c->add($criterion);
2ere maniere full mysql (donc plus safe)
$criterion->addAnd($c->getNewCriterion(ShopOrderPeer::CREATED_AT, 'DATE('. ShopOrderPeer::CREATED_AT. ') <= \''. goDate::getMySqlDateFromTs($this->filters['created_at']['to']). '\'', Criteria::CUSTOM)); $criterion->addAnd($c->getNewCriterion(ShopOrderPeer::CREATED_AT, 'DATE('. ShopOrderPeer::CREATED_AT. ') <= DATE(FROM_UNIXTIME('. $this->filters['created_at']['to']. '))', Criteria::CUSTOM));
Appliquer le patch suivant a propel:
--> http://propel.phpdb.org/trac/ticket/425
Exemple 1:
$criterion = null; $form_product_state_id = array_flip($form_product_state_id); // Test avec neuf $with_new = isset($form_product_state_id[0]); if ($with_new) { unset($form_product_state_id[0]); } // Seulement neuf ou au moins un des autres etatss ? if ($form_product_state_id) { $criterion = $c->getNewCriterion(ShopProductPeer::PRODUCT_STATE_ID, array_keys($form_product_state_id), Criteria::IN); } // Produits neufs if ($with_new) { if (!$criterion) { $criterion = $c->getNewCriterion(ShopProductPeer::PRODUCT_STATE_ID, null, Criteria::ISNULL); } else { $criterion->addOr($c->getNewCriterion(ShopProductPeer::PRODUCT_STATE_ID, null, Criteria::ISNULL)); } } $c->add($criterion);
Exemple 2
/** * Recuperation d'un produit par son code EAN * * @author lvernet * @since 18 sept. 07 */ public static function doSelectByEan($ean, Criteria $c = null) { if ($c == null) { $c = new Criteria(); } $ean = trim($ean); $padded_ean = str_pad($ean, ProductEan::EAN_STD_LENGTH, ProductEan::EAN_PADDING_CHAR, STR_PAD_LEFT); ProductPeer::isVisibleCriteria($c); $c->addJoin(ProductPeer::ID, self::PRODUCT_ID); // Test par recherche stricte $criterion = $c->getNewCriterion(self::EAN13, $ean); // Test en completant a gauche a saisie utilisateur par des 0 a 13 caraceteres $criterion->addOr($c->getNewCriterion(self::EAN13, $padded_ean)); // Test en completant a gauche le code barre en base par des 0 a 13 caraceteres $criterion->addOr($c->getNewCriterion(self::EAN13, 'LPAD('. self::EAN13 .' , 13, \'0\') = \''. $ean. '\'', Criteria::CUSTOM)); // Test en completant a gauche des codes barres et la saisie utilisateur $criterion->addOr($c->getNewCriterion(self::EAN13, 'LPAD('. self::EAN13 .' , 13, \'0\') = \''. $padded_ean. '\'', Criteria::CUSTOM)); // Exec $c->add($criterion); $product_ean = self::doSelectOne($c); return $product_ean ? $product_ean : null; }
$c = $shop->buildPkeyCriteria(); $c->addJoin(ClientQuestionPeer::SHOP_PRODUCT_ID, ShopProductPeer::ID, Criteria::LEFT_JOIN); $c->addJoin(ClientQuestionPeer::SHOP_ORDER_ID, ShopOrderPeer::ID, Criteria::LEFT_JOIN); $criterion = $c->getNewCriterion(ShopOrderPeer::SHOP_ID, $shop->getId()) ->addOr($c->getNewCriterion(ShopProductPeer::SHOP_ID, $shop->getId())); $c->addAnd($criterion); $c->addDescendingOrderByColumn(self::CREATED_AT); return $c;
$con = Propel::getConnection(); $selectCriteria = new Criteria(); $selectCriteria->add(StaticTemplatesPeer::CODE, $code); $selectCriteria->add(StaticTemplatesPeer::IS_ACTIVE, true); $ids = goPropelTools::getIdTab(self::doSelect($selectCriteria)); $updateCriteria = new Criteria(); $updateCriteria->add(self::ID, $ids, Criteria::IN); $updateCriteria->add(StaticTemplatesPeer::IS_ACTIVE, false); return self::doUpdate($updateCriteria);
public static function doSelectJoinUserAndStateAndCountry(Criteria $c, $con = null) { $c = clone $c; if ($c->getDbName() == Propel::getDefaultDB()) { $c->setDbName(self::DATABASE_NAME); } MemberPeer::addSelectColumns($c); $startcol2 = (MemberPeer::NUM_COLUMNS - MemberPeer::NUM_LAZY_LOAD_COLUMNS) + 1; UserPeer::addSelectColumns($c); $startcol3 = $startcol2 + UserPeer::NUM_COLUMNS ; CountryPeer::addSelectColumns($c); $startcol4 = $startcol3 + CountryPeer::NUM_COLUMNS ; StatePeer::addSelectColumns($c); CountryPeer::addSelectColumns($c); $c->addJoin(MemberPeer::USER_ID, UserPeer::ID); $c->addJoin(MemberPeer::STATE_ID, StatePeer::ID); $c->addJoin(MemberPeer::COUNTRY_ID, CountryPeer::ID); $rs = BasePeer::doSelect($c, $con); $results = array(); while($rs->next()) { $omClass = MemberPeer::getOMClass(); $cls = Propel::import($omClass); $obj1 = new $cls(); $obj1->hydrate($rs); $omClass = UserPeer::getOMClass(); $cls = Propel::import($omClass); $obj2 = new $cls(); $obj2->hydrate($rs, $startcol2); $omClass = StatePeer::getOMClass(); $cls = Propel::import($omClass); $obj3 = new $cls(); $obj3->hydrate($rs, $startcol3); $omClass = CountryPeer::getOMClass(); $cls = Propel::import($omClass); $obj4 = new $cls(); $obj4->hydrate($rs, $startcol4); $obj1->setUser($obj2); $obj1->setState($obj3); $obj1->setState($obj4); $results[] = $obj1; } return $results; }
/!\ Les fonctions de criterion n'acceptent que des autres criterions en parametre /!\
/!\ Appel d'une methode doSelect sans passer de criteria /!\
/!\ Passage d'une valeur nulle ou d'un objet quelquonque a place d'un criteria /!\
// Debut de la transaction $con = Propel::getConnection(); $con->begin(); try { $this->shop_ribs->saveShopRibsFromRequest($shop_ribs_form); $this->shop->setShopRibs($this->shop_ribs); $this->shop->save(); $con->commit(); } catch (Exception $e) { $con->rollback(); $this->getRequest()->setError('error', $this->getContext()->getI18N()->__('Une erreur est survenue pendant l\'enregistrement, veuillez essayer d\'ici quelques minutes.')); }
A utiliser dans le database.yml et le propel.ini:
mysql://user:password@host/database-name
Or you can use the explicit synthax:
dev:
propel:
class: sfPropelDatabase
param:
phptype: mysql
host: localhost
hostspec: localhost
database: db
username: user
password: ~
compat_assoc_lower: true
compat_rtrim_string: true
SELECT exforum.idforum AS id, exforum.datetimecreation AS date, exusers.civilite AS civilite, exusers.nom AS nom, exusers.prenom AS prenom, exforum.sujet AS sujet, count(tab2.id) AS count FROM exusers, exforum LEFT OUTER JOIN ( SELECT id, idforum FROM exmessagesforum ) AS tab2 ON tab2.idforum = exforum.idforum WHERE exforum.iduser = exusers.iduser GROUP BY exforum.idforum, exforum.datetimecreation, exusers.civilite, exusers.nom, exusers.prenom, exforum.sujet LIMIT 0 , 4
ALTER TABLE exbatch_commandes AUTO_INCREMENT = 5000;
// Prochain numero de sequence $filename .= '-'. myPropel::getNextSeq(ExbatchCommandesPeer::TABLE_NAME);
myPropel.class.php
/** * Fonction retournant la prochaine valeur autoincrement d'une table * * @author Vernet Loic * @since version - 28 févr. 2007 */ public static function getNextSeq($table_name) { $sql = "SHOW TABLE STATUS LIKE '$table_name'"; $con = Propel::getConnection(); $stmt = $con->createStatement(); $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); $rs->first(); return $rs->get('Auto_increment'); }
$c = new Criteria(); $c->clearSelectColumns()->addSelectColumn(ClientsPeer::IDCLIENT); $c->addSelectColumn(ClientsPeer::NOM); $rs = ClientsPeer::doSelectRS($c); $clientsWithId = myPropel::getTabFromRS($rs);
Fonction getTabFromRS:
/** * Fonction retournant un tableau avec un ensemble de colonnes selectionnees * a l'aide d'un resultset * * @author Vernet Loic * @since 2 janv. 2007 */ public static function getTabFromRS($rs, $one_row = false) { $tab = array(); while ($rs->next()) { $tab[] = $rs->getRow(); } return $one_row ? $tab[0] : $tab; }
logs
8514.6 KB