Magento 常用SQL命令

Magento SQL命令可以加快解决你遇到的问题,不同版本,数据库可能会有所不同,所以SQL命令可能也会有所变化,在用SQL命令的时候一定要记得备份!!

1. 批量调整所有产品的价格 ( 参考命令在 1.3 下通过 )
UPDATE `catalog_product_entity_decimal` SET value=round(value*1.45) WHERE attribute_id=99;
执行完后,需要到缓存管理里刷新:Layered Navigation Indices ,即可同步数据库里的关联表。

2. 批量处理所有 exclude 状态的图片
UPDATE `catalog_product_entity_media_gallery_value` SET disabled=0 WHERE disabled=1;

3. 导出导入 Magento 所有分类和产品
分类和产品是存放在以 catalog 开头的所有表中,对这组表进行导出导入即可实现此功能。
导入分类产品的 SQL 文件前注意:
在首行加入:SET FOREIGN_KEY_CHECKS=0;
在末行加入:SET FOREIGN_KEY_CHECKS=1;
原因是 Magento 使用 Innodb 存储引擎。

4. 批量修改分类的 Display Settings ——> Is Anchor 值为 No
UPDATE `catalog_category_entity_int` set value=0 WHERE value=1 AND attribute_id=120;

5. 清空邮件队列
TRUNCATE TABLE `newsletter_queue`;
TRUNCATE TABLE `newsletter_queue_link`;
TRUNCATE TABLE `newsletter_queue_store_link`;
注意:同时向上万顾客发邮件时,不要在后台查看邮件队列,不然服务器压力会很大,待邮件发完之后,

记着清空邮件队列,这样在后台进入邮件队列就不会大量消耗服务器资源了。

6. Magento 转移站后,经常会出现下面这个提示,运行一下下面的SQL命令即可恢复正常。
错误提示: Notice: Undefined index: 0 app/code/core/Mage/Core/Model/Mysql4/Config.php on

line 92
SET FOREIGN_KEY_CHECKS=0;
update `core_store` set store_id = 0 where code=’admin’;
update `core_store_group` set group_id = 0 where name=’Default’;
update `core_website` set website_id = 0 where code=’admin’;
update `customer_group` set customer_group_id = 0 where customer_group_code=’NOT LOGGED IN’;
SET FOREIGN_KEY_CHECKS=1;
不过要明白,这个错误是使用了第三方数据库备份工具导致的,Magento 自带的备份功能是不会出现这个

错误的。

7. 根据产品的 SKU 批量将产品自定义选项设为非必填:
UPDATE `catalog_product_option` SET is_require=0 WHERE product_id IN (SELECT entity_id FROM

`catalog_product_entity` WHERE sku LIKE ‘SKU %’);

8. 关闭/开启 所有缺货产品
SET FOREIGN_KEY_CHECKS=0;
UPDATE `catalog_product_entity_int` SET value=2 WHERE attribute_id=80 and entity_id IN

(SELECT product_id FROM `cataloginventory_stock_status` WHERE stock_status=0);
SET FOREIGN_KEY_CHECKS=1;
其它说明:value=2 为关闭,1为开启,attribute_id 对应不同版本的产品禁用项,最后执行完命令需要

重建分类索引。

9. 取消所有问题邮件订阅
UPDATE `newsletter_subscriber` SET subscriber_status=3 WHERE subscriber_id IN (SELECT

subscriber_id FROM `newsletter_problem`);

10. 清除产品与分类的描述与 Meta
重置所有产品short description
UPDATE `catalog_product_entity_text` SET value=’Short Description’ WHERE

attribute_id=506;
清除所有产品Meta
UPDATE `catalog_product_entity_text` SET value=” WHERE attribute_id=97 OR

attribute_id=104;
UPDATE `catalog_product_entity_varchar` SET value=” WHERE attribute_id=103 OR

attribute_id=105;
清除所有产品URL
UPDATE `catalog_product_entity_varchar` SET value=” WHERE attribute_id=481;
清除所有分类描述:
UPDATE `catalog_category_entity_text` SET value=” WHERE attribute_id=112 OR

attribute_id=115 OR attribute_id=116;
清除所有分类URL
UPDATE `catalog_category_entity_varchar` SET value=” WHERE attribute_id=479;

11. 重置 Magento 所有 ID 统计数(如订单编码、发票编码等)
TRUNCATE `eav_entity_store`;
ALTER TABLE `eav_entity_store` AUTO_INCREMENT=1;

12. 批量禁用产品 —— 数据库操作
CREATE TABLE XYTMPTB SELECT entity_id,value FROM `catalog_product_entity_varchar` WHERE

value LIKE ‘affliction%’ AND attribute_id=96;
UPDATE `catalog_product_entity_int` SET value=1 WHERE attribute_id=273 AND entity_id IN

(SELECT entity_id FROM `XYTMPTB`);
DROP TABLE XYTMPTB;
别忘了重建索引!

13. 分类与产品的反向开关
UPDATE `catalog_category_entity_int` SET value=if(value=0,1,0) WHERE attribute_id=119;
UPDATE `catalog_product_entity_int` SET value=if(value=1,2,1) WHERE attribute_id=273;
运行一下,开的关了,关的开了,再运一下反之,最后别忘了重建索引!

14. 清站相关提示
能在后台清理的就在后台清理,直接对数据库操作有造成网站出错的可能性。其他辅助命令如下:
清除订单命令:
TRUNCATE `sales_flat_invoice`;
TRUNCATE `sales_flat_invoice_grid`;
TRUNCATE `sales_flat_invoice_item`;
TRUNCATE `sales_flat_order`;
TRUNCATE `sales_flat_order_address`;
TRUNCATE `sales_flat_order_grid`;
TRUNCATE `sales_flat_order_item`;
TRUNCATE `sales_flat_order_payment`;
TRUNCATE `sales_flat_order_status_history`;
TRUNCATE `sales_flat_quote`;
TRUNCATE `sales_flat_quote_address`;
TRUNCATE `sales_flat_quote_address_item`;
TRUNCATE `sales_flat_quote_item`;
TRUNCATE `sales_flat_quote_item_option`;
TRUNCATE `sales_flat_quote_payment`;
TRUNCATE `sales_flat_quote_shipping_rate`;
清除其它日志:
TRUNCATE `log_url_info`;
TRUNCATE `log_visitor_info`;
TRUNCATE `log_url`;
TRUNCATE `log_visitor`;
TRUNCATE `core_url_rewrite`;
TRUNCATE `report_event`;
TRUNCATE `report_viewed_product_index`;

15. Magento 数据库清理

安全模式:清理日常数据库的无用记录
TRUNCATE TABLE `log_visitor`;
TRUNCATE TABLE `log_visitor_info`;
TRUNCATE TABLE `log_url`;
TRUNCATE TABLE `log_url_info`;
干净模式:清理数据库的无用记录
TRUNCATE `log_visitor` ;
TRUNCATE `log_url_info` ;
TRUNCATE `log_visitor_info` ;
TRUNCATE `dataflow_batch_import` ;
TRUNCATE `log_url` ;
TRUNCATE `report_event` ;
TRUNCATE `log_visitor_online` ;
备注:如果是转移网站,URL 重写表 core_url_rewrite 也可清空,转完站重建 URL 即可。

16. 批量修改 SKU、Meta、Name 等字段里的部份词
UPDATE `catalog_product_entity` SET sku=replace(sku,’oldskuw’,'newskuw’) WHERE sku LIKE

‘%oldskuw%’;
UPDATE `catalog_product_entity_text` SET value=replace(value,’oldmetaw’,'newmetaw’)

WHERE value LIKE ‘%oldmetaw%’;
UPDATE `catalog_product_entity_varchar` SET value=replace(value,’oldnamew’,'newnamew’)

WHERE value LIKE ‘%oldnamew%’;

17. 批量调整指定产品的价格
create table xytmptb SELECT entity_id,value FROM `catalog_product_entity_varchar` WHERE

(value LIKE ‘%Boot%’ OR value LIKE ‘%Shoes%’) AND attribute_id=60;
UPDATE `catalog_product_entity_decimal` SET value=value+10 WHERE entity_id IN (SELECT

entity_id FROM `xytmptb`) AND attribute_id=64;
drop table xytmptb;
最后别忘了重建价格索引!

转自:http://www.51qcweb.com/collate-the-most-common-magento-sql-commands.html

此文章通过 python 爬虫创建,原文是自己的csdn 地址: Magento 常用SQL命令

magento Shopping Cart Price Rule 购物车促销规则

magento 有着强大的促销规则设置,能满足许多常规的促销手段。

(当然在现实问题中,我们在很多地方是需要定制开发的。)

这里主要解析下magento 的 Shoppping Cart Price Rule.

我们先假定实现一个购买sku为 VGN-TXN27N/B的商品1个就免费送1个。

1.首先在后台选择 promotions->Shoppping Cart Price Rules

2. 设定 rule information 选项卡(这里就不全面演示各种情况的设定了。)

coupon 选择 specific coupon即使用优惠券的方式

use Auto Generation 表明需要自己优惠券代码。

use per Coupon 表明一个优惠券可以用几次, 举例:如果设定为2用户 A 使用了这张优惠券后,用户 B 也是可以使用的,

而设定为1表示 A 使用了 B 就不能再使用了。

use per Customer 表明一个用户可以使用几次,举例: 如果设定为2 那么用户 A 使用这张优惠券购买完后,再次购买还是可以使用的,但是第三次就不可以了。

Priority 优先级(避免和其他的shopping cart price rule 冲突)

3.Actions 选项卡

先说actions 选项

apply 这个select 下有4个选项

1.Percent of product price discount 百分比折扣

2.Fixed amount discount 定额折扣

3.Fixed amount discount for whole cart 整个购物车定额折扣

4.Buy X get Y free (discount amount is Y) 买x免费获得y个

这里选择我之前一直没弄明白的buy x get y free (其实这个你只要一测试就发现怎么使用了,就是不能懒 。)

discount amount 代表y , Discount Qty Step(Buy x) 代表x 这里就是买一送一的意思。

Free Shipping 是否可以免运费

Stop Further Rules Processing 是否停止进一步处理规则

(Maximun Qty Discount is Applied To 和  Apply to Shipping Amount 作用没测试过,有谁测试过帮忙告诉下,拜谢!)

细看这个选项卡下面还有一栏内容

Apply the rule only to cart items matching the following conditions (leave blank for all items)

暂时先不管(下面会回头继续讲解,这个功能很重要的

4.Conditions 选项卡

设定(促销)规则生效的条件,注意:这里的条件针对的是购物车里的所有商品,或者说整个购物车。

假设我们设定 购买产品sku为 VGN-TXN27N/B 的

这里首先需要选择Product attribute combination 然后才会有sku(没有的话去属性那里 修改使用促销规则为是即可)

这里和actions 选项卡下面的条件构成了促销规则的强大的灵活性。你可以根据实际情况进行各种各样的设置。

最后就是生成优惠券了

5.Manage Coupon Codes 选项卡

1).Coupon Qty 优惠券数量

2).Code Length 优惠券代码长度

3).Code Format 优惠券代码的格式

4).Code Prefix 优惠券前缀

5).Code Suffix 优惠券后缀

6).Dash Every X Characters 每几个字符进行分割

设置好后点击生成即可。

这个时候保存就行了。(当然你也可以去Labels 选项卡设置前台显示的优惠券名称)

(购物车规则是没有应用规则按钮的,只要是active就会生效的,而 catalog Price Rule 不仅仅需要保存,还要点击Apply 才能生效。好吧又唠叨了。。。)

6. 前台效果

这时候我们选择sku 为 VGN-TXN27N/B 的商品,添加购物车,并使用生成的其中一个优惠券即可。

那么买1赠1这个规则是如何生效的呢?

原来你添加一个在购物车,使用优惠券后并没有任何变化,用户根本不知道你的赠送是怎么给的。

当你修改购物车数量为2个的时候就会发现价格减去了1个的单价。买1赠1就是这么实现效果的。

7. 分析

到这里并没有结束,因为你再次添加一个商品,修改数量为2 会发现这个商品也减少了一个单价,我们并不需要这个商品

也是买1赠1。 另一方面修改购物车中商品数量为4会发现减去了价格减去了两个单价,意味着每买1个都赠送1个。

假设我们希望只赠送一次。应该怎么办呢?

8.进一步完善

回到之前的 Conditions选项卡,前面强调过这个选项卡针对的是整个购物车,当添加了一个sku满足条件的商品时,规则就生效了

且针对的是每一个商品,即每个商品都可以买一赠一。

那么我们需要去掉这里的条件,将条件设置到actions 选项卡的下面设置条件的那栏内容里。这里此时只针对符合条件的商品。

其它的sku不是 VGN-TXN27N/B 的是不会买一赠一的,另一方面限制只赠送一次。这里面的设置就存在缺陷了,如图:

及设置数量为2才生效。但如果用户想要购买4件,即花三件的钱这样就不能实现了。(难道必须修改代码?)

(大家有其它好的方法麻烦告诉下。 再次拜谢!)

这个时候基本的要求就实现了。通过这里的设置,你完全可以设置类似

0元购买(不是添加一个0元的商品。。。),满减,打折等等优惠政策了。

本文不涉及代码,仅仅是设置操作。大牛勿喷,欢迎讨论,分享你实现的独特的促销手段。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: magento Shopping Cart Price Rule 购物车促销规则

svn 的使用(一)

一. 安装svn  服务器(操作系统centos)
yum install subversion
可以通过 subversion -v 命令查看是否安装成功
如果提示没有subversion 命令 是因为我们还需要创建svn 库
执行命令:
mkdir -p /svn/repos
svnadmin create /svn/repos
cd /svn/repos
ls
可以看到多出了许多文件和文件夹::conf  db  format  hooks  locks  README.txt
此时svn服务器的安装基本完成了。
二. svn配置
cd /svn/repos/conf
ls
可以看到文件:authz  passwd  svnserve.conf
1.首先配置passwd文件
vi passwd
添加类似账户
m0sh1 = admin
#格式为 用户名 = 密码
保存退出
2.配置authz文件
添加内容
[/]
m0sh1
#这两句表明 用户m0sh1 对整个目录都有访问的权限(你可以自己去设定更详细的目录权限)
3.配置 svnserve.conf
anon-access = none # 使非授权用户无法访问
auth-access = write # 使授权用户有写权限
password-db = password # 密码文件
authz-db = authz   # 访问控制文件
realm = m0sh1Svn
采用默认配置. 以上语句都必须顶格写, 左侧不能留空格, 否则会出错.
三. 开启服务进行测试
启动svn
svnseve -d -r /svn/repos
#如果已经运行了svn 还想再创建一个,可以通过设定不同端口来解决此问题
svnseve -d -r /svn/repos2 --listen-port 3313
启动成功后我们就可以通过本地的 TortoiseSVN 连接了(TortoiseSVN自行搜索下载即可)
svn 链接地址:
svn://server address (如果指定端口需要添加端口  :端口号)
四. 创建项目
1.你可以直接在这个svn server 所在的服务器上通过命令
svn improt project 导入项目
svn add file 添加文件(目录)
2.在windows 下使用 TortoiseSVN 工具 选中项目目录右键点击import 留下message 提交即可
3.在windows 下新建目录右键鼠标选择checkout,然后将项目文件复制到此目录,最后右键commit即可(留下message)
五. svn 版本管理
SVN 的结构一般是这样的:
svn:// your project
     +trunk/
         app/
         lib/ ...
     +branches/
         +braches_1.0/
     +tags
         +tag_release_1.0
当有开发需求的时候,从主干(trunk)上做分支(branch),当一个分支开发完毕,测试无误的情况下应该
合并到trunk上,如果在trunk上有问题可以在trunk做一些修改。当完成一个阶段,有一个可以发布的稳定项目
版本就可以打个tag了。
trunk中放置的始终都应该是一个稳定的版本, 在分支开发的开发人员应该经常和trunk同步(trunk merge  到branch
这不会改变trunk的代码),否则你会和trunk版本越来越远。分支合并到主干的时候要进过仔细测试后才能提交到commit
(但是commit 又应该尽快,防止别人也修改了trunk)
当然整体的流程应该依据实际情况设定。 svn的merge 可以单独搜索相关资料。^ _ ^
 
 下节会简单总结一下 svn hook的使用。
  例如上面的假设是一个web项目,trunk更新,同时web测试服务器也更新trunk代码。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: svn 的使用(一)

svn 的使用(二)

这篇主要介绍下 svn 钩子的使用,svn 的安装以及配置等可以查看 svn 的使用(一)

我们可以在svn创建的仓库文件夹下看到 hooks 文件夹。
这里面就存放这个各种svn操作同时会执行的脚本文件。
(你可以自己查看每个脚本文件,文件开始都有英文的介绍包括功能,参数以及返回值。
   我翻译的不好所以就采用网上其它资料的解释吧 - -! )
1.start-commit  开始提交的通知
输入参数:传递给你钩子程序的命令行参数,顺序如下:
    1. 版本库路径
    2. 已经认证过的提交的用户名
它在提交事务产生前已运行,通常用来判定一个用户是否有权提交。返回0表示认证通过。
2.pre-commit 在提交结束之前提醒
输入参数:传递给你钩子程序的命令行参数。顺序是:
     1. 版本库路径
     2. 提交事务的名称
在事务完成提交之前运行,通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个bug追踪的ticket号,或者是 要求日志信息不为空)而不允许的提交。无错误返回0。

 
3.post-commit  成功提交的通知
传递给你钩子程序的命令行参数,顺序为:
     1. 版本库路径
     2. 提交创建的修订版本号
它在事务完成后运行,创建一个新的修订版本。无错误程序正常退出。
 
4.pre-revprop-change 版本属性修改
因为Subversion的修订版本属性不是版本化的,对这类属性的修改(例如提交日志属性svn:log)将会永久覆盖以前的属性值。因为数据在此可能 丢失,所以Subversion提供了这种钩子(及与之对应的post-revprop-change),因此版本库管理员可用一些外部方法记录变化。作 为对丢失未版本化属性数据的防范,Subversion客户端不能远程修改修订版本属性,除非为你的版本库实现这个钩子。
5.post-revprop-change 版本属性修改
这个钩子与pre-revprop-change对应。事实上,因为多疑的原因,只有存在pre-revprop-change时这个脚本才会执行。当这 两个钩子都存在时,post-revprop-change在修订版本属性被改变之后运行,通常用来发送包含新属性的email。版本库传递四个参数给该 钩子:到版本库的路径,属性存在的修订版本,经过校验的产生变化的用户名,和属性自身的名字。

使用这些钩子最简单的方法就是
拷贝某个脚本,去掉.tmpl扩展名,然后自定义钩子的内容,确定脚本是可运行的。
PS:一定要确保钩子脚本是可执行的。而且名称就是去掉.tmpl后的名字。
另外要注意要使用SVN的钩子一定要开设权限,而且是要用运行SVN的账号进行执行这些钩子
(如果不是可以运行的会提示错误,错误代码为255,其他错误可以自行尝试。。)
我想要做的就是 用户commit 后服务器(测试环境的)自动同步 即做update操作
这里我的web服务器和svn服务器 在一台。(如果是远程的web服务器可以在
先使用ssh命令登入

那么我们需要使用的钩子是post-commit
我们可以使用命令
cp post-commit.tmpl post-commit.tmpl.bak
mv post-commit.tmpl post-commit
(别忘了 chmod 设置为可执行的)
chmod 755 post-commit
vi post-commit
这里我们可以先做一个测试
即在文件最后加上一行
/bin/echo "commit" >> /tmp/commit.out
然后执行commit 操作 看一下 commit.out 是不是多了 commit这个单词
那么编写我们的脚本在post-commit 文件最后添加命令
/usr/bin/svn update /www/project --username m0sh1 --password m0sh1
PS:这里要 加上绝对路径 , update 后面的是checkout 下来的项目路径
如果提示错误 svn: Can't convert string from native encoding to 'UTF-8'
则需要添加一行命令
export lang = en_US.UTF-8
此时去工作目录看下是不是更新了。。

再举个例子,有很多开发人员为了快,往往忽略掉提交日志信息(也可能无意为之),那么我们可以在pre-commit脚本
中做出必须提交日志信息的限制:
REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" |
   grep "[a-zA-Z0-9]" > /dev/null || exit 1

# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

# All checks passed, so allow the commit.
exit 0
(上面内容直接就是pre-commit脚本中的内容,那么只需要给pre-commit可执行的权限就可以了。)
之后我们就可以以此,类推出其它想要实现的功能了。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: svn 的使用(二)

如何使用magento的HTML输出缓存

文章原文是 magento wiki 里的一篇文章:

http://www.magentocommerce.com/wiki/5_-_modules_and_development/block_cache_and_html_ouput

我会在下一篇文章给出另外的使用例子。

在magento中, 某一块的html 会被存入magento 缓存中。

如果你是初始安装一个magento系统,此时除了前端和后台的 头部缓存在magento cache中,其它的几乎都没有被magento缓存。

举例1:

缓存管理必须写在Block的初始化函数中:

class {NS}_{Module}_Block_{View} extends Mage_Core_Block_Template {
 
    protected function _construct()
    {
        $this->addData(array(
            'cache_lifetime'    => 120,
            'cache_tags'        => array(Mage_Catalog_Model_Product::CACHE_TAG),
        ));
    }   
 
}

在这个例子中,我们设置了缓存时间为120 秒,输出代码会被缓存直到产品缓存被清除。(当然是在缓存时间没到的情况下)

结果:

1. 保存任何产品都会删除这个缓存。

2.当你这么做的时候你会发现所有的产品页都是一样的。

举例2:

考虑下面的例子:

class {NS}_{Module}_Block_{View} extends Mage_Core_Block_Template {
 
    protected function _construct()
    {
        $this->addData(array(
            'cache_lifetime'    => 120,
            'cache_tags'        => array(Mage_Catalog_Model_Product::CACHE_TAG),
            'cache_key'            => $this->getProduct()->getId(),
        ));
    }   
 
}

结果:

1.不同的产品id 页面不同

2.保存任何产品都会删除这个缓存

举例3:

class {NS}_{Module}_Block_{View} extends Mage_Core_Block_Template {
 
    protected function _construct()
    {
        $this->addData(array(
            'cache_lifetime'    => 120,
            'cache_tags'        => array(Mage_Catalog_Model_Product::CACHE_TAG . "_" . $this->getProduct()->getId()),
            'cache_key'            => $this->getProduct()->getId(),
        ));
    }
   
}

结果:

1.不同的产品id 页面不同

2.只有改变指定的产品才会删除这个缓存

以上例子只针对产品,如果你想对产品分类做同样的事情你必须重写上面的模型(例子),添加一下内容:

public function cleanCache()
    {
        Mage::app()->cleanCache('catalog_category_'.$this->getId());
    }   
   
    protected function _beforeSave() {
        $this->cleanCache();
        return parent::_beforeSave();
    }

提示:

如果cache_lifetime 设置成为false 意味着缓存将不会过期。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: 如何使用magento的HTML输出缓存