[Zope3-dev] Re: [Zope-DB] Relational Databases in Zope 2 and Zope
3
Smith, Neil (Worcester)
Neil.Smith at npower.com
Tue Jun 29 06:52:53 EDT 2004
Say you've got a database table like:
create table products (
product varchar2(60),
colour varchar2(20),
size varchar2(10),
available number(5)
)
and you want to have a method to search it allowing people to specify any or
none of the columns.
At the moment with the sqlgroup/sqltest/and stuff, you'd have a SQL method:
<params>
product
colour
size
available
</params>
select * from products
<dtml-sqlgroup where>
<dtml-sqltest product type=nb optional>
<dtml-and>
<dtml-sqltest colour type=nb optional>
<dtml-and>
<dtml-sqltest size type=nb optional>
<dtml-and>
<dtml-sqltest available op=gt type=int optional>
</dtml-sqlgroup>
Now if you left all the params null to get a complete list of products it
would render
select * from products
If you wanted a large thingamyjig, you'd just specify those parameters and
it would render
select * from products
where
product = 'thingamyjig'
and
size = 'large'
Looking for products where there are more than a 1000 in stock, just put
1000 in stock and null in the others would give:
select * from products
where
available > 1000
etc..
Putting dtml-if's in to do the equivalent isn't trivial. Try it and see,
then think about doing it with a table where you wanted to allow searching
on many more columns.
My other example was just trying to put the logic into the SQL rather than
having any dtml-... statements. Ignoring the number column, it would need
to be:
<params>
product
colour
size
available
</params>
select * from products
where (
<dtml-sqlvar product type=string> is null or
product = <dtml-sqlvar product type=string>
) and (
<dtml-sqlvar colour type=string> is null or
colour = <dtml-sqlvar colour type=string>
) and (
<dtml-sqlvar size type=string> is null or
size = <dtml-sqlvar size type=string>
)
So for the examples as above you'd get:
all products:
select * from products
where (
'' is null or product = ''
) and (
'' is null or colour = ''
) and (
'' is null or size = ''
)
large thingamyjigs:
select * from products
where (
'thingamyjig' is null or product = 'thingamyjig'
) and (
'' is null or colour = ''
) and (
'large' is null or size = 'large'
)
which works, but isn't nice.
I guess for the numeric columns you'd have to do something like
) and (
'<dtml-sqlvar available type=int>' is null or
available > to_number('<dtml-sqlvar available type=int>')
)
however it's not worth thinking about too much as I'd only wanted to show
that trying to do this in SQL got nasty and I think that's fairly apparent
already.
Of course all this is wrong anyway as we should have bound parameters rather
than generating new SQL statements each time and polluting the SQL cache.
If that was changed, then all this would be a bit different too.
--
Neil
-----Original Message-----
From: Charlie Clark [mailto:charlie at egenix.com]
Sent: 29 June 2004 10:54
To: zope-db at zope.org; Neil.Smith at npower.com
Subject: RE: [Zope3-dev] Re: [Zope-DB] Relational Databases in Zope 2
and Zope 3
On 2004-06-29 at 10:22:14 [+0200], "Smith, Neil (Worcester)"
<Neil.Smith at npower.com> wrote:
> The point of the dtml-sqlgroup and dtml-sqltest is surely to provide a
nice
> way of handling the case where you don't pass in the parameter, so it
> doesn't render the WHERE, AND, = etc. And it does this quite well.
Maybe it does. I've never found cause to use it and scratched my head a lot
trying to look at it. I'd hate to maintain such stuff something which Ian
Bicking seems to complain about.
> If you remove it, then you'll need either an exponential number of SQL
> methods and some logic before it to decide which to call, or you'll have
to
> fill the SQL method with even more confusing dtml-if statements, or you'll
> have to have your SQL something like:
>
> WHERE (
> <dtml-sqlvar parameter_1 type=..> is null or
> column_1 = <dtml-sqlvar parameter_1 type=..>
> ) and (
> <dtml-sqlvar parameter_2 type=..> is null or
> column_2 = <dtml-sqlvar parameter_2 type=..>
> )
Interesting example. This says to me that the model is bad: NULLs are
indicative of this. It's also intriguing that to see the relation variables
passed in as relation values. I think this will probably cause an error on
rendering. Okay, so nit-picking aside: you are right to say that <dtml-if>s
can cause problems on larger methods. I find that readibility is still there
but I get problems when I might only want to return a certain value based on
something I'm passing in. Working on my larger ZSQL methods has reminded me
of working on HTML pages which is why I find ZPT attractive.
I think what might be the biggest problem is the lack of good examples on
this. The stuff in Zope book does not seem to me to be written with real
world experience so maybe you've got a concrete example with the resultant
SQL for us to discuss?
Charlie
This e-mail is provided for general information purposes only and does not constitute investment or transactional advice. For the avoidance of doubt the contents of this email are subject to contract and will not constitute a legally binding contract.
The information contained in this e-mail is confidential and intended only for the use of the addressee. If the reader of this message is not the addressee, you are hereby notified that you have received this e-mail in error and you must not copy, disseminate, distribute, use or take any action as a result of the information contained in it.
If you have received this e-mail in error, please notify postmaster at npower.com (UK 01384 275454) and delete it immediately from your system.
Neither Npower nor any of the other companies in the RWE Innogy group from whom this e-mail originates accept any responsibility for losses or damage as a result of any viruses and it is your responsibility to check attachments (if any) for viruses.
Npower Limited Registered office: Windmill Hill Business Park, Whitehill Way, Swindon SN5 6PB. Registered in England and Wales: number 3653277. This e-mail may be sent on behalf of a member of the RWE Innogy group of companies.
**********************************************************************
More information about the Zope-DB
mailing list