<div dir="ltr"><div><div><div>Thanks DJ.  I had to read the wiki article on what am ORM was!<br><br></div>This course only has two chapters on databases, so I&#39;m guessing we dive deeper in another course!<br><br></div>Thanks again!<br></div>Dave<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 13, 2015 at 4:36 PM, DJ-Pfulio <span dir="ltr">&lt;<a href="mailto:djpfulio@jdpfu.com" target="_blank">djpfulio@jdpfu.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">ORMs are double edged.<br>
<br>
Some are buggy and create lots of opportunities for SQL-injection attacks.<br>
<br>
Some are slow and suck RAM ... like Java, Outlook, iTunes.<br>
<br>
Some will be faster to code, create better (faster/safer) SQL than an<br>
intermediate developer, only call the DBMS when results are actually needed,<br>
and protect against all the currently known attacks ... I&#39;m talking about DBIx,<br>
of course.  The ORM that all other languages wish they had. ;)<br>
<br>
Oh - and more ORMs abstract the DBMS away - swap in whatever back-end DB you<br>
like - mysql, postgres, sqlite, mariadb ... are usually each supported with<br>
others often supported like Oracle, DB2, Informix, etc. Some ORMs might support<br>
noSQL too, but using a specialized class is probably best.<br>
<br>
I haven&#39;t written any direct SQL in webapps in about 7 yrs. It just hasn&#39;t been<br>
worth my time. If there are fewer than 20K concurrent users, I wouldn&#39;t bother<br>
writing SQL until specific profiling showed it was needed.<br>
<br>
In the 1990s, my company did &quot;migrations&quot; for our DBs in a way similar to<br>
Rails::Migrate ... Clearly, I like that method and wish more ORMs did it that way.<br>
<br>
For internal corporate webapps, I&#39;d always start with an ORM regardless of<br>
language - perl, python, ruby.  These are each wonderful languages and folks<br>
should understand how great it is to have choices like these today.<br>
<br>
Perl + DBIx + Dancer + CPAN is an awesome toolkit for whipping out a webapp or<br>
creating an enterprise web application developed for years.<br>
<br>
Ruby + Rails/Sinatra + ActiveRecord (or one of 10 other Ruby ORMs) ... ruby-gems<br>
is only slightly less so. Gems and ActiveRecord are beasts, but ruby is a<br>
gorgeous language. Maintaining Gems takes too much RAM.  I&#39;ve had to add a GB of<br>
RAM to VMs to patch Gems, otherwise, the updates would never complete. Then take<br>
the RAM away to keep monthly costs reasonable.<br>
<br>
No experience with python - my personal issue with languages that care about<br>
whitespace. Wish python were my first language instead of FORTRAN 66, so I<br>
wouldn&#39;t have the issue.<br>
<br>
Of course, this is just 1 person&#39;s opinion. Certainly, direct SQL written by an<br>
expert can be great too, but getting to that level of competence is just not<br>
necessary most of the time.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On 03/13/2015 03:00 PM, Charles Shapiro wrote:<br>
&gt; Heh. Hadda look that one up.   Could work great, depending on resources and<br>
&gt; purpose.<br>
&gt;<br>
&gt; -- CHS<br>
&gt;<br>
&gt;<br>
&gt; On Fri, Mar 13, 2015 at 2:51 PM, DJ-Pfulio &lt;<a href="mailto:DJPfulio@jdpfu.com">DJPfulio@jdpfu.com</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt; Or just use an ORM.<br>
&gt;&gt;<br>
&gt;&gt; On 03/13/2015 02:36 PM, Charles Shapiro wrote:<br>
&gt;&gt;&gt; Hmm. I&#39;m not that familiar with MySQL, but in PostgreSQL the way to<br>
&gt;&gt; determine<br>
&gt;&gt;&gt; what you want is<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; select<br>
&gt;&gt;&gt;    <a href="http://animal.id" target="_blank">animal.id</a> &lt;<a href="http://animal.id" target="_blank">http://animal.id</a>&gt;<br>
&gt;&gt;&gt; from<br>
&gt;&gt;&gt;    animal<br>
&gt;&gt;&gt; left join<br>
&gt;&gt;&gt;    food<br>
&gt;&gt;&gt; on<br>
&gt;&gt;&gt;    <a href="http://animal.id" target="_blank">animal.id</a> &lt;<a href="http://animal.id" target="_blank">http://animal.id</a>&gt; = food.animalid<br>
&gt;&gt;&gt; where<br>
&gt;&gt;&gt;    <a href="http://food.id" target="_blank">food.id</a> &lt;<a href="http://food.id" target="_blank">http://food.id</a>&gt; is null<br>
&gt;&gt;&gt; ;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Writing SQL queries takes some practice.  One handy tip I&#39;ve found is to<br>
&gt;&gt; write<br>
&gt;&gt;&gt; the &quot;from...&quot; part first, then go back and fill in what columns you wish<br>
&gt;&gt; to select.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Doing anything based on the numeric value of the &quot;id&quot; field is a Bad<br>
&gt;&gt; Idea.  In<br>
&gt;&gt;&gt; most relational databases, that field just increments when you add a<br>
&gt;&gt; record to<br>
&gt;&gt;&gt; your table.  It never decrements when you delete records.  That means<br>
&gt;&gt; that the<br>
&gt;&gt;&gt; ID value itself is useless in determining what is or is not in a table.<br>
&gt;&gt;  It&#39;s<br>
&gt;&gt;&gt; only useful when it&#39;s in another table -- hence the name, &quot;Relational&quot;.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Your current table setup also breaks down if you add -- say -- a goat<br>
&gt;&gt; which<br>
&gt;&gt;&gt; wants to eat the same things as the giraffe. You&#39;re more likely to have<br>
&gt;&gt; several<br>
&gt;&gt;&gt; animals linked to the same foods than several foods linked to the same<br>
&gt;&gt; animal.<br>
&gt;&gt;&gt; Don&#39;t you really want a &quot;FoodFk&quot; in the &quot;animal&quot; table?  Then you could<br>
&gt;&gt; have<br>
&gt;&gt;&gt; lots of animals which eat the same thing.  Of course, I reckon in<br>
&gt;&gt; reality you&#39;d<br>
&gt;&gt;&gt; need a jump table to link foods and animals:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; food_animal { integer animalid references animal(id), integer foodid<br>
&gt;&gt; references<br>
&gt;&gt;&gt; food(id) }<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Then you could have lots of different foods and lots of different<br>
&gt;&gt; animals all<br>
&gt;&gt;&gt; linked together.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; -- CHS<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Fri, Mar 13, 2015 at 1:52 PM, David S Jackson &lt;<a href="mailto:deepbsd.ale@gmail.com">deepbsd.ale@gmail.com</a><br>
&gt;&gt;&gt; &lt;mailto:<a href="mailto:deepbsd.ale@gmail.com">deepbsd.ale@gmail.com</a>&gt;&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     Hi,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     I&#39;m a MySQL newbie.  I&#39;m just starting to use Python to talk to MySQL<br>
&gt;&gt;&gt;     databases, but first I need to understand the MySQL query language!<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     So, I have two tables:  (zoo) animal and food.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     animal has the columns ID, NAME, FAMILY, WEIGHT<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     food has  ID, ANIMALID, FEED<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     So if I go: select id, name, family, feed from animal JOIN food ON<br>
&gt;&gt; <a href="http://animal.id" target="_blank">animal.id</a><br>
&gt;&gt;&gt;     &lt;<a href="http://animal.id" target="_blank">http://animal.id</a>&gt;=food.animalid;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     I get something like:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     ID   NAME        FAMILY      FEED<br>
&gt;&gt;&gt;     1    Seymore   Snake        mice, leaves<br>
&gt;&gt;&gt;     2    Gerard      Giraffe       leaves, grass<br>
&gt;&gt;&gt;     ...<br>
&gt;&gt;&gt;     etc<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     So, if I have a situation where I want to see whether an animal has<br>
&gt;&gt; been<br>
&gt;&gt;&gt;     added the animal table but may have not been added to the food<br>
&gt;&gt; table, how<br>
&gt;&gt;&gt;     would I compose that query?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     That is, the animal could have been added to the animal table and<br>
&gt;&gt; could get<br>
&gt;&gt;&gt;     an id, say 10, but the food table could have 20 foods already<br>
&gt;&gt; entered and<br>
&gt;&gt;&gt;     the animal-id would be used several times.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     I was thinking, is there a way I can ask, &quot;does the highest<br>
&gt;&gt; <a href="http://animal.id" target="_blank">animal.id</a><br>
&gt;&gt;&gt;     &lt;<a href="http://animal.id" target="_blank">http://animal.id</a>&gt; number equal the highest food.animalid number&quot;?<br>
&gt;&gt; If not,<br>
&gt;&gt;&gt;     what animal is not getting fed?<br>
<br>
<br>
</div></div><div class="HOEnZb"><div class="h5">_______________________________________________<br>
Ale mailing list<br>
<a href="mailto:Ale@ale.org">Ale@ale.org</a><br>
<a href="http://mail.ale.org/mailman/listinfo/ale" target="_blank">http://mail.ale.org/mailman/listinfo/ale</a><br>
See JOBS, ANNOUNCE and SCHOOLS lists at<br>
<a href="http://mail.ale.org/mailman/listinfo" target="_blank">http://mail.ale.org/mailman/listinfo</a><br>
</div></div></blockquote></div><br></div>