On Thursday, August 14, 2014 1:27:00 PM UTC-7, Patrick Kuykendall wrote:
>
> Hello!
>
> I'm running into a little issue with update statements on models that I've
> aliased. Maybe I'm aliasing them the wrong way, I'm not sure. Would you
> mind taking a look? I'd love a little input. Thanks!
>
> In an earlier post (
> https://groups.google.com/forum/#!topic/sequel-talk/HB-rONDy_eg) I asked
> about using fully qualified names for joining models across databases, and
> this solution worked wonderfully. (Thanks again!)
>
> I've used that method on all of my models, but decided I'd like to alias
> the models as well to help clean up some of the join conditions and such.
> So, I've defined the models as such:
>
> class Table < Sequel::Model(DB.from(Sequel.qualify(:database,
> Sequel.qualify(Sequel.lit('[DBO]'), :table)).as(:tab)))
>
>
> When I call an for an update to a Table object, it results in SQL
> similar to this:
>
> UPDATE TOP (1) [DATABASE].[DBO].[TABLE] AS [TAB] SET [COLUMN] = 'value'
> WHERE [TABLEID] = 1
>
>
> Unfortunately, this syntax isn't acceptable for MSSQL, and I receive a
> TinyTDS error.
>
> Is there anyway to disable the alias for update statements, or should I be
> aliasing them in a different manner?
>
Quite a few databases support aliased tables in update statements, and
automatically unaliasing them is a bad idea, as the filter could be using
the alias.
Here's a hack that may work which will automatically unalias the table by
changing the update SQL produced by a dataset with an aliased table:
DB.extend_datasets do
private
def update_table_sql(sql)
sql << ' '
f = @opts[:from]
identifier_append(sql, unaliased_identifier(f.first))
end
end
but a better solution is just to override _update_dataset in the model:
class Table
private
def _update_dataset
ds = super
ds.from(Sequel.qualify(:database, Sequel.qualify(Sequel.lit('[DBO]'),
:table)))
end
end
If you plan to delete rows, overriding _delete_dataset may be a good idea
as well.
Thanks,
Jeremy
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.