Chris made migrations sexy. So sexy, in fact, that DHH committed a variation of his plugin to trunk.
I’m not here to make things sexy. I’m here to make migrations drop-dead gorgeous.
Remember that file that no one uses and normally leaves of subversion?
No, not doc/README_FOR_APP. I’m talking about db/schema.rb of course.
Turns out with this plugin I wrote, it’s the baddest file in your source code.
“How bad, PJ?” you ask.
So bad that when you change your schema.rb from
ActiveRecord::Schema.define(:version => 1) do create_table :posts do |t| t.string :title t.text :body end end
to
ActiveRecord::Schema.define(:version => 1) do create_table :posts do |t| t.string :title t.text :body t.integer :published end create_table :comments do |t| t.string :name, :url t.text :body t.integer :post_id end end
and run
$ rake db:auto:migrate
it’ll execute the following:
-- add_column("posts", :published, :integer)
-> 0.0096s
-- create_table(:comments)
-> 0.0072s
Pretty slick. Run the task again and nothing will happen, just like regular migrations, but change the file and the plugin will do its best to figure out what you’ve done.
What it is Chief
The plugin’s logic is fairly straightforward. It’ll look at the tables & fields you’ve defined in the schema, compare those to the tables & fields in the database, and figure out what it needs to add and drop.
I’ll be adding support for indexes (added, check below) and type changes (also added, last update) shortly.
Limitations
Now, I’m sure you’ve been thinking of all of the cases where this isn’t going to work. Right off the bat, it’s clear you couldn’t use this if you wanted to change the name of an existing column. There’s no way for auto_migrations to know your actual intention, it would drop the original column and create the new one.
But, Can It Scale?!
That having been said, this plugin doesn’t prevent you from running regular migrations if you feel the need. The only thing to keep in mind is that running regular migrations will overwrite schema.rb, so you’ve been forewarned if you’ve spent a long time making the file look pretty.
I’m willing and able to accept patches to make auto_migrations more useful, though. My knowledge of ActiveRecord is seriously lacking, so if there’s room to clean stuff up, please let me know.
Check it Out
Warehouse: http://plugins.require.errtheblog.com/browser/auto_migrations
SVN: svn://errtheblog.com/svn/plugins/auto_migrations
Bugs/Patches: http://err.lighthouseapp.com/projects/466-plugins/tickets
1% Inspiration and 99% Perspiration
The concept for this plugin came when I noticed a migrations branch had been added to DataMapper. Being able to auto-migrate with DM seemed so logical since the fields are defined in the models. It wasn’t until Chris pointed out that schema.rb could be used for the same purpose that I realized auto migrations were possible in Rails as well.
If you’re curious how the auto migration code works for DM, take a look at the rake task I built for vJot. Interestingly enough, due to the way the migrations have been tentatively built for DM, the code is significantly shorter compared to auto_migrations and I know even less about DM than ActiveRecord.
Wait, you mean you aren’t subscribed to Err’s changeset feed? vJot has been powered by DataMapper since the end of July, but I’ll save that for another post.
Breaking News
I’ve just committed support to handle indexes. Using the original example, I’ll add a simple index:
ActiveRecord::Schema.define(:version => 1) do create_table :posts do |t| t.string :title t.text :body t.integer :published end add_index :posts, :published create_table :comments do |t| t.string :name, :url t.text :body t.integer :post_id end end
Followed by:
$ rake db:auto:migrate
-- add_index("posts", ["published"])
-> 0.0216s
Actually, I’m not sure I really need that index, I’ll comment it out for now:
ActiveRecord::Schema.define(:version => 1) do create_table :posts do |t| t.string :title t.text :body t.integer :published end # add_index :posts, :published create_table :comments do |t| t.string :name, :url t.text :body t.integer :post_id end end
And auto-migrate again:
$ rake db:auto:migrate
-- remove_index("posts", {:name=>"index_posts_on_published"})
-> 0.0187s
Dynamite.
Update: Parte Due
I’m here to please, so I’ve just committed a really straightforward AutoMigrations.schema_to_migration method, which can be called via:
$ rake db:schema:to_migration
If you’re still unsure why you’d use this plugin over regular migrations, you have no excuse now not to try it. It’s really quite fun to use while the schema is still volatile. When things calm down a bit, run the rake task to create the migration and proceed as usual.
Last Time, I Swear
I’ve added change_column support to handle type changes. Assuming the database looks like:
ActiveRecord::Schema.define(:version => 1) do create_table :posts do |t| t.string :title t.text :body t.integer :published end end
But, we decide to build the next twitter and the body column only needs to be a varchar:
ActiveRecord::Schema.define(:version => 1) do create_table :posts do |t| t.string :title, :body t.integer :published end end
Followed by:
$ rake db:auto:migrate
-- change_column("posts", :body, :string)
-> 0.0309s
I’ve really appreciated all of the feedback so far. My next step is to add the :was support and then I think we’ll have something here. Who would’ve thought modifying the database could be fun?!
You errs are sexy code reincarnated! Can you join the Rails core team, please?
this is a very cool piece of code. Isn’t there some logic behind having a distinct, ordered archive of migrations, though? Like say we realize we need to rollback a set of changes we made last week? Does auto_migrations keep a log?
@Austin I haven’t built any facilities to log changes, but it’s certainly possible to add that to the plugin.
August: Unfortunately Rick and I had a knife fight on the hull of a pirate ship 15 years ago and I won, something he still begrudges me to this day.
(That, and we don’t actually patch Rails, just release fancy add-ons.)
Could you handle column renames by having the user comment out the column to be changed in schema.rb and add the changed info on the very next line?
Okay, my question seems silly now that I’ve looked at the code. I’m sure you could parse schema.rb for comment/redef pairs, but that looks to be more trouble than it’s worth.
I must be missing something* because I don’t see what this brings to the party over regular AR migrations.
@John this probably isn’t something that you should be using in your production apps (at least not yet), but it dramatically speeds up the development loop for schema changes when you want to quickly prototype something.
For renames, would something like this work?
adding an option to generate a migration file could be a nice way of migrating down later on.
Crashes out with:
rake aborted! undefined method `attr_accessor_with_default’ for #
Any clues?
Oh, it requires edge rails and active_resource. Froze to edge, installed ActiveResource and works.
Thanks for the heads up Selford.
I’ve removed attr_accessor_with_default from the plugin so running edge is no longer a requirement.
Brilliant work PJ. Now working beautifully on 1.2.3. Thanks a lot.
This plugin would be wonderful if it wrote out a migration file. As it is, it seems like this is roughly equal to just faffing around with ALTER TABLE statements in the database (well, with much better syntax (grin)).
The reason why migrations are utterly fantastic is because they solve the production deployment problem—“my database needs changes for this new version of my app. Rails, please make that happen. kthxbye”.
I think Hobo generates migrations from differences in the database and defined schema: http://hobocentral.net/blog/2007/07/06/so-long-migrations/
This is fantastic! I am one of those that do lots of little changes in schema. This plugin will help me a lot. And +1 for :was=>:title thing and migration generation.
Hearing you guys loud and clear, I’ll add the ability to generate a migration from the schema.rb shortly.
+100 for optionally (on by default) automagically writing a migration file … : )
This is to database-source code synchronization what Rails is to web development. I personally don’t like the migration scheme currently used by Rails—this is much better. The problem I have with the original migration scheme is many-fold: When developing with a team, the numbered files often clash; If you have to pull out a change, you either have to create a new migration to “migrate up” to a previous version, or rename your files so that all later changes are now before the change you want to migrate out; It requires having the files to migrate down. For example, if you want to take a 2 month old (stable) copy of your app from subversion/CVS using a timestamp/tag, and you want to downgrade to it based on current data, your copy doesn’t have the newer migration files needed to downgrade. I’m definitely going to use this in its place. Great job!
Seriously, all I care about is that my expectations for the database (aka db/schema.rb) match the database. I really don’t care what (artificial) version of migration I have to set it to. When developing, why should I have to migrate down, make a change to my migration file, and then migrate back up? Why can’t I just change my schema to what I want and say “make it so”? Need to back out an older change? Just comment it out in the schema. The real versioning I should be tracking is the version of the schema in my Version Control Software. When different team members are working on schema modifications, you simply merge the schema.rb file.
As for the troublesome renaming issue (for columns and tables too), I agree using the :was => :x or :was => [:x, :y, :z] (for developers that constantly change their mind. To solve the downgrading problem (because previous versions didn’t know you’d be changing their names), I recommend utilizing the comment field for columns and tables to record the aliases—so if you can look there if the “was” isn’t specified in the file. You can use a string like “column_name_was=x,y,z”. Only drawback, can’t recycle names (a => b, c => a)
- Just my (very opinionated) 2 cents worth.
Great post, incredibly sexy migration!! :D I just think this can be a little tricky to use in production environment with a lot of programmers, can’t it? I still think it’s safer to use the migrations in its original form, with its versions, upgrades and downgrades. Perhaps it could generate a new migration file when you change the schema.rb file! This way, you could try some different database structures with the db:auto:migrate and, when you find the final one, it could generate a final migration from the old schema to the new defined schema! Anyway, congratulations for the migrations! :D
Felipe Giotto
I think like Matt. The generate of migration file will be amazing.
9 out of 10 hoes agree:
Schema.rb is the hottest customer on the block right now
kudos!
Hey PJ. I waited a bit to try this out as I am swamped at work, and I get harassed for always trying to use new stuff (and getting the team to use em as well) in our project as we race towards our R1.
Well, our migrations have gotten out of hand (numbering-wise, we use err’s remigrate so changes aren’t all over or anything) and I fired up auto migrate and ran one more remigrate to recreate the schema, then did some work on it (like adding indexes) and WOW! BANG! POW! Holy horse dung Batman, I am sold like a Kirby.
Another great plugin from some really clever guys. Thanks a bunch.
Perhaps I am missing something, but whenever I do a db:test:prepare my schema.rb gets all unsexyfied. Am I doing something terribly wrong?
hey – if you like this, go check out the completely automated migrations in the Hobo plugin (hobocentral.net)- no more schema.rb either! just write your models and let Hobo write the migrations automatically for you.
By the way, the ‘sexy migration’ plugin stated above that has found its way into Rails actually originated from the Hobo project.
Go check it out…
I’ve been thinking.. and something like this, but which operates on attributes (columns) defined actually in the models would totally kick ass. Rails has it ass-backwards on this front.. wtf do we need to write migrations and schemas when that info should really be in the model in the first place.
To prevent rake tasks from dumping over your pretty schema (eg, in my case, RSpec), you can add the following kludge to the end of your Rakefile:
Rake.application.instance_variable_get(:@tasks).delete(‘db:schema:dump’) namespace(:db){namespace(:schema){task(:dump){puts “Schema dump disabled”}}}
Great plugin! Thanks. I always found migrations quite unsexy and not very suitable for version control at all.
Peter Cooper really has a point there! I do not want to look in schema.rb or migrations if I can’t remember which attributes my model has, or what I called them. I want to look in the model!
It seems not to work with ActiveRecord’s table name prefix, the plugin tries to change prefix+prefix+tablename instead of prefix+tablename
mm… anyone get it working with :primary_key table option in schema?
—change_column(“movimento_equip”, :movimento_id, :primary_key) rake aborted! Mysql::Error: #42000Multiple primary key defined: ALTER TABLE `movimento_equip` CHANGE `movimento_id` `movimento_id` int(11) DEFAULT NULL auto_increment PRIMARY KEY DEFAULT NULL
Your link: http://plugins.require.errtheblog.com/browser/auto_migrations
is showing a 404
Link http://plugins.require.errtheblog.com/browser/auto_migrations is broken & ruby script\plugin install svn://errtheblog.com/svn/plugins/auto_migrations is also not working
The plugin is now located at:
http://github.com/pjhyett/auto_migrations
The best article, thanks to the author. good jokes, funny jokes
this is a very cool piece of code. I always found migrations quite unsexy and not very suitable for version control at all Digital Frames .
Cruise Critics Lower Back Tattoos Victorias Secret Victorias Secret Womens Clothing Victorias Secret Bra Victorias Secret Swim Wear Victorias Secret Thong Victorias Secret Credit Card Victorias Secret Angel Credit Card
Victorias Secret Online Catalog Victorias Secret Coupon Code Victorias Secret Coupon Victorias Secret Pink Victorias Secret Lingerie Victorias Secret Angels Victorias secret promotion code Victorias Secret Commercial Victorias Secret Store Location and Outlets Victorias Secret Products Victorias Secret History Victorias Secret Sale Victorias Secret Models Victorias Secret Fashion Show
Audrina Patridge Fashion Layered Hairstyles Layered Hair Styles Layered Hairstyle Calvin Klein Calvin Klein Fragrance Calvin Klein Underwear Calvin Klein Cologne Calvin Klein Bra Calvin Klein Boxer Calvin Klein Bikini
Calvin Klein 365 Calvin Klein Perfume Calvin Klein Jeans Calvin Klein Briefs Calvin Klein Dresses Calvin Klein Men Calvin Klein Lingerie Calvin Klein Clothing Calvin Klein Models Lower Back Tattoos Victorias Secret
Want to go to tibet tour? You can rely on us! All you need is a special travel permit which you can easily obtain from Access tibet tour。We are expert in tour in tibet. based in Tibet 15 years experience, 600 private groups operated! So join us for your wondrous tibet travel! Are you interested in mysterious Lhasa travel to tibet? Why not take our Lhasa tibet trekking? You can appreciate the holiness of Lhasa tibet tour guide with our well-connected itinerary and leave a memorable recollection over life. These are China Lhasa tibet thangka packages with personal local tibet map, and private vehicle with driver + hotels + entrance fees and meals as listed for your party based on minimum 2 travelers. Tibet Buddhist Sects and Characteristics, For single person, please email us for new quotations. For any questions, please feel free to contact our customer team with our prompt and personalized travel services.
传统的上海商业地产在当前正面临痛苦的决断,在部分城市,随着北京写字楼市场的量价齐跌,“断供”、“抛售”等现象正日益刺激着投资者已经脆弱的信心,回报率下降、投资风险增加,使得上海办公楼类产品的投资价值正遭受着空前的置疑,那么在目前股市走熊、住宅低潮的情况,是不是所有的房产产品都不具备投资价值呢?其实不然,上海写字楼、商铺、上海商务楼等商务性质的房产产品依然保有较高的投资价值,目前在广州、上海等发达城市,上海写字楼租赁与功能多样化的办公楼出租正成为投资者的新宠。 一元租金写字楼 二元租金写字楼 三元租金写字楼 四元租金写字楼 五元租金写字楼 六元租金写字楼 七元租金写字楼 八元租金写字楼 九元租金写字楼 十元租金写字楼 十五元租金写字楼 二十元租金写字楼 商铺 商住楼 商务中心 创意园区 厂房 酒店公寓 随着物权法的完善,“住宅禁商”的逐步实施,这些企业将不得不寻求于上海写字楼或 上海办公楼。中小型企业多为成长型,企业发展战略多存在不稳定性,低成本入驻与较高的外在形象是这类企业考虑办公场所的重点,而上海办公楼的租售价格、物业管理费用相对较高,更多的中小型企业会选择既能满足上海写字楼出租的用途,又可以实现居住功能的商住楼商务楼。客源上的充足保证了商用办公房的低空置率,写字楼租金回报更稳定。 更多链接; 上海办公楼中介 上海浦东办公楼 静安区办公楼 黄浦区办公楼 长宁区办公楼 卢湾区办公楼 徐汇区办公楼 普陀区办公楼 上海商铺出租 上海厂房租赁 上海创意产业园区租赁 上海商务中心出租 华敏翰尊 虹桥银城 上海华都大厦 胜康廖氏 华源世界广场 沙田大厦 彩虹QQ BIKE 金融危机,金融风暴 麻风树 蝇蛆 汽车 qq游戏马 QQ记牌器下载 qq空间全黑背景代码 qq空间蓝色背景代码 qq空间白色背景代码 qq空间粉色背景代码 qq空间小窝背景代码 梦幻西游qq表情下载 炮炮兵qq表情下载 黄金价格 黄金价格走势,黄金价格(每盎司) 今日黄金价格,黄金价格(每克) 国际黄金价格,黄金价格(每公斤) 汇率换算,各国汇率换算 上海办公楼中介 浦东办公楼中介 静安写字楼,静安办公楼中介 黄埔写字楼,黄埔办公楼中介 徐汇写字楼,徐汇办公楼中介 卢湾写字楼,卢湾办公楼中介 上海办公楼中介 浦东办公楼出租 静安写字楼租赁 上海黄埔办公楼 长宁区写字楼租赁 卢湾写字楼租赁 徐汇办公楼出租 普陀写字楼租售 创意园区 商务中心 上海写字楼中介 浦东办公楼 静安办公楼 黄埔办公楼 徐汇办公楼 卢湾办公楼 上海写字楼中介 上海写字楼中介 上海办公楼,上海办公楼中介 黄浦区办公楼,上海黄浦区办公楼租售 徐汇区办公楼,徐汇区办公楼租赁 静安区办公楼,静安区办公楼出租 浦东办公楼,上海浦东办公楼 长宁区办公楼,长宁区办公楼中介 上海办公楼,上海卢湾区办公楼
wow goldwow goldwow gold Age of Conan gold cheap Ffxi gil to our loyal reliable customers.
world of warcraft goldbuy wow goldcheap wow goldaoc goldwow power levelingwow powerlevelingwow levelingworld of warcraft goldbuy wow goldcheap wow goldwow power levelingwow powerlevelingbuy wow goldcheap wow goldwow power levelingwow powerlevelingrunescape goldrunescape moneyEverQuest 2 goldeq2 platEverQuest 2 goldeq2 platMaple Story Mesos maplestory MesosMaple Story meso maplestory meso Final Fantasy XI gilffxi gilLOTRO GoldLOTR Goldlord of the ring goldGranado Espada VisGranado Espada goldGE moneydofus kamaskamas dofusrunescape goldrunescape moneyflyff penyabuy flyff goldflyff moneyEverQuest platbuy eq goldEverQuest goldeq plateq goldAge of Conan goldage of conan power levelingfinal fantasy xi gilffxi gildofus kamaskamas dofusLOTRO GoldLOTR Goldlord of the ring goldsilkroad goldbuy silkroad goldAge of Conan goldage of conan power levelingmaple story mesosmaplestory mesosmaple story mesoffxi gilwow levelingwow power levelingwow powerlevelingwow goldwow power levelingwow powerlevelinghero online goldimvu creditskal geonknight goldlast chaos goldlineage adenalineage 2 adenalord of the rings goldlotro goldlotr goldmaple story mesosmaplestory mesosmaplestory mesoperfect world goldpirates of the burning Sea goldaoc goldaoc goldaoc goldAge of Conan goldaoc power levelingaoc levelingaoc goldWarhammer goldaoc power levelingaoc levelingfinal fantasy xi gilfinal fantasy 11 cheap gilfinal fantasy 11 cheap gilBuy Warhammer goldBuy Warhammer goldcheap ffxi gilcheap ffxi gilcheap ffxi gilwow goldWarhammer goldWarhammer goldBuy Warhammer goldBuy Warhammer goldWarhammer goldWarhammer goldBuy Warhammer goldBuy Warhammer goldWarhammer goldLOTRO Gold
By the whole family to Zhang’s defense capability, first of all to protect the safety of Saint Knight. Mmoinn to buy you the best of wow gold it! mmoinn.com is the most professional trade platform, it is simple and fast, you can save huge expenditures, so that you buy cheapest wow gold , This is an absolute value of the Oh! And you can easily find world of warcraft sale in the Wow power leveling , as soon as possible to allow you to flex its muscles in the Knights of St. it!
Tattoos Celtic Tattoos Lower Back Tattoos Dragon Tattoos Skull Tattoos Heart Tattoos Butterfly Tattoos Chinese Tattoos Layered Hair Styles Layered Hairstyles Emo Hairstyles Medium Hairstyles Bang Hairstyle Prom Hairstyle Hair Coloring Heart Lower Back Tattoos
How to download YouTube videos for mac and convert the .FLV files on Mac OS? Here are the easy-to-use and top-user-rating YouTube Video Grabber Mac and Mac FLV converter tools. It is safe to install and no spyware or adware guarenteed.
How to download and convert the FLV files on Mac OS? Here are the easy-to-use and top-user-rating Free YouTube Downloader for Mac and FLV converter tools. It is safe to install and there are no spyware or adware.
With the YouTube Converter for Mac application, you can easily download youtube for mac and convert YouTube videos on your Mac OS.
I suggest 2 FLV Converter for Mac software. One is powerful in download YouTube Videos and convert downloaded FLV files; the other is professional in video converting, which can not only convert .flv video to all media formats, but also can convert all kinds of video formats to .flv, plus popular videos.
For anyone with old or elderly loved ones, it is important to take care of your care for the elderly at home residential care facility for the elderly residential care facilities for the elderly care for the elderly at home nursing care for the elderly residential care for the elderly care services for the elderly social care for the elderly care homes for the elderly care home for the elderly community care for the elderly in hopes making sure you or your old / elderly loved ones are taken care of with the best nursing care available
sikiş porno sex video izle iyi porno uzun porno yeni pornolar porno seyret sex seyret porno filmler sex izleyin sex izle porno sex erotik porn video türk porno canlı porno porno izle porno porno film sex filmleri porn video porno film sex seyret porno video seyret orgazm porno seks izle erotik video sex videolar yetişkin video sex video izle porno video izle bedava porno 18 video seks porno sıcak izle yetişkin film sikiş seyret sex amatör videolar teen video erotik videolar yetişkin video yetişkin videolar pornolar porno video teen kızlık bozma sikiş sikiş video seks türban sex sex erotik seks izle sıcak ateşli
دليل مواقع - منتدى - يوتب
fg,j,e ];j,v fg,j,e - برق fvr - نت لوق kj g,r - مدرسة المشاغبين l]vsm hglahyfdk - جريدة الرياض [vd]m hgvdhq - fvhl[ kj برامج نت - You tube يو تيوب - jvhtdhk ترافيان - العاب hguhf - برامج جي سوفت fvhl[ [d s,tj – دردشة تعب قلبي ]v]am juf rgfd - شات الرياض ahj hgvdhq - بلوتوث غشمشم fg,j,e yalal –
modern abstract art sofa manufacturer гранит 净水器 混合机 过滤机 DHL快递 保险箱 法兰 法兰标准 牛皮癣 皮肤病 北京快递公司 北京国际快递 传世私服 传奇世界私服 天龙八部私服 天龙私服 网络电话 免费网络电话 假发 补发 织发 植发 上海搬家公司 上海搬场公司 大众搬家 大众搬场 张家界旅游 香港旅游 深圳旅行社 打包机 收缩机 萎缩性胃炎 neoprene laptop bags SEO优化 SEO优化 计量泵 胃炎 胃病 冷水机 冰水机 工业冷水机 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 北京办证 办证 北京特价机票 北京打折计票 北京国际机票 北京机票预定 北京飞机票 北京订机票 北京机票查询 血糖仪 血糖仪 银杏 水培花卉 企业宣传片 空分设备 机电设备安装 代孕 代孕网 代孕 代孕 代孕 试管婴儿 代孕 电话交换机 程控交换机 集团电话 集装袋 混合机混合机 混合机捏合机 捏合机 捏合机导热油炉 导热油炉 导热油炉 反应釜 反应釜 反应釜 回流焊 波峰焊 spherical roller bearing 搬运车 搬运车 电动搬运车 油桶搬运车 堆高车 电动堆高车 半电动堆高车 堆垛车 高空作业平台车 电动叉车 平衡重叉车 前移叉车 电瓶叉车 苗木价格 苗木信息 标牌制作 深圳标牌 儿童摄影 北京儿童摄影 防静电鞋 淘宝刷信誉 威海凤凰湖 威海海景房 大庆密封件 打标机 淘宝刷信誉 TESOL/TEFL国际英语教师证书 英语教师进修及培训 韩国饰品批发 代写论文 代写论文 代写论文 代写代发 论文代写 电源模块 模块电源 X架 超薄灯箱> 易拉宝 展柜制作 代理服务器 游戏加速器 网络加速器 网通加速器 电信加速器 电信网通转换器 电信网通加速器 网通电信互转 网通电信互通 网络游戏加速器 美国VPN代理 美国独享VPN 美国独享IP pvc ceiling panel Spherical roller bearings 天龙八部私服 SEO优化 安全鞋 劳保鞋 防砸鞋 电绝缘鞋 上海安全鞋 上海劳保鞋 江苏劳保鞋 服装软件 服装管理软件 进销存软件 进销存管理软件 服装管理系统 服装进销存软件 进销存系统 进销存管理系统 免费进销存软件 吉林中医 东北特产 打包机 dhl 阳痿 阴茎短小 阴茎增大 早泄 前列腺炎 阴茎增粗 阴茎延长 国际机票 上海国际机票 国际打折机票 国际特价机票 CRM 客户管理软件 客户关系管理 免费客户管理软件 客户管理软件下载 客户信息管理系统 销售管理系统 销售管理 CRM系统 CRM软件 客户关系管理系统 客户关系管理软件 客户管理 客户管理系统 营销管理系统 客户资源管理 销售管理软件 客户资料管理软件 客户资源管理软件 客户信息管理软件 客户资料管理 客户资源管理 客户信息管理 客户资料管理系统 客户资源管理系统 客户管理软件免费版 砂磨机 砂磨机 砂磨机 卧式砂磨机 卧式砂磨机 卧式砂磨机 三辊研磨机 三辊研磨机 三辊研磨机 混合机 混合机 混合机 锥形混合机 锥形混合机 锥形混合机 行星动力混合机 行星动力混合机 行星动力混合机 无重力混合机 无重力混合机 无重力混合机 干粉砂浆设备 干粉砂浆设备 干粉砂浆设备 捏合机 捏合机 捏合机 导热油炉 导热油炉 导热油炉 反应釜 反应釜 反应釜 搪玻璃反应釜 搪玻璃反应釜 搪玻璃反应釜 乳化机 涂料设备 干混砂浆设备 无重力混合机 胶体磨 涂料成套设备 双螺旋混合机 北京婚庆 北京婚庆公司 400电话 办证 呼吸机 制氧机 亚都 亚都加湿器 亚都净化器 亚都装修卫士 饰品批发 小饰品批发 韩国饰品 韩国饰品批发 premature ejaculation penis enlargement 破碎机 制砂机 球磨机 雷蒙磨 雷蒙磨粉机 鄂式破碎机 鄂式破碎机 免烧砖机 加气混凝土设备 反击式破碎机 选矿设备 安利产品 马来西亚留学 网站优化 网站推广 衬布 代写论文 代写论文 代写论文 论文代写 代写论文 代写硕士论文 代写毕业论文 磁力泵 离心泵 化工泵 隔膜泵 螺杆泵 潜水泵 油泵 耐腐蚀泵 泵 水泵 拖链 防护罩 排屑机 塑料拖链 钢铝拖链 水泵 磁力泵 隔膜泵 离心泵 液下泵 自吸泵 多级泵 排污泵 螺杆泵 油泵 化工泵 电动隔膜泵 气动隔膜泵 自吸式磁力泵 氟塑料磁力泵 管道离心泵 导热油泵 深井泵 潜水泵 污水泵 潜水排污泵 深圳装饰 深圳装饰公司 深圳装修公司 特价机票 打折机票 国际机票 机票 新风换气机 换气机 立式新风换气机 风机箱 新风系统 能量回收机 搅拌机 混合机 乳化机 分散机 毛刷 毛刷辊 工业毛刷 刷子 钢丝刷 涂层测厚仪 硬度计 兆欧表 激光测距仪 测振仪 转速表 温湿度计 风速仪 超声波测厚仪 粗糙度仪 噪音计 红外测温仪 万用表 硬度计 万用表 美容院 美容加盟 澳洲留学 澳大利亚留学 什么是法兰 电烤箱 酒店预定 北京酒店预定 北京酒店 离心机 nail equipment nail products nail product nail uv lamp nail uv lamp nail uv lamps uv nail lamp nail brush nail file nail tool nail tip nail gel curing uv lamps lights 万用表 风速仪 红外测温仪 噪音计
情趣用品,情趣用品,情趣用品,情趣用品,情趣用品,情趣,情趣,情趣,情趣,情人歡愉用品,情惑用品性哥,情人用品性哥,情趣用品,AIO交友愛情館,情人歡愉用品,美女視訊,情色交友,情人用品性哥,視訊交友,辣妹視訊,美女交友,性愛,嘟嘟成人網,按摩棒,震動按摩棒,微調按摩棒,情趣按摩棒,逼真按摩棒,G點,跳蛋,跳蛋,跳蛋,性感內衣,飛機杯,充氣娃娃,情趣娃娃,角色扮演,性感睡衣,後庭區,SM,潤滑液,情趣禮物,威而柔,香水,精油,芳香精油,自慰,自慰套,性感吊帶襪,情趣用品加盟,情人節禮物,情人節,吊帶襪,辣妹視訊,美女交友,情色交友,成人交友,視訊聊天室,美女視訊,視訊美女,情色視訊,免費視訊聊天,視訊交友,視訊聊天,AIO交友愛情館,嘟嘟成人網,成人貼圖,成人網站,AIO交友愛情館,情色,情色貼圖,情色文學,情色交友,色情聊天室,色情小說,七夕情人節,色情,A片,A片下載,免費A片,免費A片下載,情色視訊,情色電影,色情網站,辣妹視訊,視訊聊天室,情色視訊,免費視訊聊天,視訊聊天,美女視訊,視訊美女,美女交友,美女,情色交友,成人交友,自拍,本土自拍,情人視訊網,視訊交友90739,生日禮物,情色論壇,正妹牆,正妹,成人網站,A片,免費A片,A片下載,免費A片下載,AV女優,成人影片,色情A片,成人論壇,情趣,免費成人影片,成人電影,成人影城,愛情公寓,色情影片,保險套
Thanks so much for this! This is exactly what I was looking for
mirc mırc mırç mirç mirc indir mirc yükle mirc yukle türkçe mirc mirc indir mirc islami sohbet kelebek kelebek script kelebek sohbet kelebek mirc chat çet cet çet odaları sohbet kanalları sohbet odaları kameralı sohbet kameralı chat sohbet eğlence mirc sohbet odaları sevgili arkadaş arkadaş bul arkaraş ara oto araba şarkı sözleri astroloji ikinci el telefon gazete gazeteler günlük gazeteler marifetname bedava domain ücretsiz domain benimurl parça kontör parça kontör radyo dinle bedava blog ücretsiz blog
video ödev indir şarkı sözleri video izle şiir türkü indir güzel sözler fıkra porno izle pornolar 18
Victorias Secret Victoria’s Secret Fashion show Victorias Secret Pink Victorias Secret Model Victorias Secret Credit Card Victorias Secret Coupon Code Victorias Secret Lingerie Victorias Secret Fashion Show 2005 Victorias Secret Fashion Show 2006 Victorias Secret Bra Victorias Secret Catalog Victorias Secret Pantie Victorias Secret Online Coupon Victorias Secret Fashion Show 2007 Victorias Secret Girl Free Shipping Victorias Secret Victorias Secret Home Victorias Secret Christmas Victoria’S Secret Pink Dog Victorias Secret Music Victorias Secret Semi Annual Sale Victorias Secret Jobs Victorias Secret Free Shipping Code Victorias Secret Shoes Victorias Secret Thong Victorias Secret Commercial Victorias Secret Promotional Code Victorias Secret Love Spell Victorias Secret Boots Victorias Secret Employment Victorias Secret Reviews Victorias Secret Jeans Victorias Secret Brasil Victorias Secret Bag
Yep, I’ve been using this when building district information
情人用品,情人用品性哥,情 人用品,情趣用品,視訊交友,視訊美女,視訊美女,視訊交友網,視訊聊天室,視訊聊天室,視訊 交友網,免費視訊聊天,辣妹視訊,辣妹視訊,情人視訊網
徵信社,案件討論,男女專區,法律諮詢,相關新聞,情趣用品,情趣用品,情趣精品,情趣用品,情趣用品,情趣用品,情趣用品,威而柔,自慰套,自慰套,SM,充氣娃娃,充氣娃娃,潤滑液,飛機杯,按摩棒,跳蛋,性感睡衣
威而柔,自慰套,自慰套,SM,充氣娃娃,充氣娃娃,潤滑液,飛機杯,按摩棒,跳蛋,性感睡衣,視訊交友90739,情人視訊網,情色交友,視訊交友,辣妹視訊,美女視訊,aio交友愛情館,情色論壇,成人論壇,免費視訊聊天,辣妹視訊,視訊交友網,美女視訊,視訊交友,成人視訊,情趣用品,成人聊天室,情趣,情趣,視訊聊天室,視訊聊天,視訊聊天室,情色視訊,情人視訊網,免費視訊聊天室,aio交友愛情館,色情遊戲,寄情築園小遊戲,情色文學,一葉情貼圖片區
Chime in.