SQLAlchemy has 2 main layers, the "Core" layer which deals with mostly
database-level constructs, such as Tables, and the ORM layer, which is
built on top of Core. With the ORM, you map your own classes onto the
lower-level Tables, then work with instances of those classes. You appear
to be using the declarative system to define your classes, so SQLAlchemy
will be creating the associated Table instances for you under the hood.

In your example, Customer is an ORM-level class. Somewhere, there will be a
construct representing the Core-level Table that the Customer class is
mapped to. (It's probably available at Customer.__table__, but also in
other places).

When you say that "self.choices" contains table objects, I suspect that
those are the Core-level Table instances. When you query using those, you
don't get Customer objects back. You need to query using the Customer class
instead. Can you get the Customer class into your self.choices array,
either instead of the table, or as well as? Where are you getting the
object that you are putting in the first element of each of the
self.choices list?

Simon

On Thu, Feb 4, 2016 at 11:34 AM, Alex Hall <ah...@autodist.com> wrote:

> It's all from a GUI, so it's something like this (my code isn't in front
> of me):
> DBInterface.session"query(self.choices[self.selectedIndex][0]).all()
> Choices is a 2D array where the first (0th) element of each sub-array is a
> table object. The query works, because I get the records as expected and
> can display them or inspect them. I just can't modify them for some reason.
> As I said, though, I'm new to this package so am likely missing an obvious
> step, or have something set up very wrong.
>
> Sent from my iPhone
>
> > On Feb 3, 2016, at 16:18, Simon King <si...@simonking.org.uk> wrote:
> >
> > OK, so you’re not actually getting Customer objects back from your
> query. What does your call to session.query() look like? For this to work,
> it really ought to be something like “session.query(Customer)”. I suspect
> you are doing something like “session.query(Customer.id, Customer.name, …)”
> instead.
> >
> > Simon
> >
> >> On 3 Feb 2016, at 17:43, Alex Hall <ah...@autodist.com> wrote:
> >>
> >> I'm on the Gmail site, so am not sure I can reply in-line. Sorry.
> >>
> >> This is a basic table class, like
> >> class Customer(base):
> >> __tablename__ = "customers"
> >> name = Column(String(50)),
> >> ...
> >>
> >> When I print the type:
> >> <class 'sqlalchemy.util._collections.result'>
> >> And repr():
> >> (2, u'Powersports Etc', 5554443210L, u'ahall+dbte...@autodist.com',
> True)
> >>
> >>
> >>> On 2/3/16, Simon King <si...@simonking.org.uk> wrote:
> >>>> On Wed, Feb 3, 2016 at 3:54 PM, Alex Hall <ah...@autodist.com> wrote:
> >>>>
> >>>> Hello list,
> >>>> I'm new to SQLAlchemy, but not to Python. I have an application that's
> >>>> coming together, and relies on SQLAlchemy to talk to a database for
> >>>> many of the app's functions. Listing tables, listing records, updating
> >>>> records, pulling records for internal use, and so on.
> >>>>
> >>>> My app is working, but so far I've been writing the framework and GUI
> >>>> with a bit of SQLite just to check that things are working how I want.
> >>>> Now, though, I'm getting into my first "real" user-facing database
> >>>> task: taking the values from a dialog and updating a record according
> >>>> to those values. Thus far, I'm having no luck.
> >>>>
> >>>> My organization for now is DBInterface.py, which holds all my table
> >>>> definitions, database details, and my base, session, and engine
> >>>> objects. I can hear the groans from here; I do plan to move the table
> >>>> definitions into a module of their own at some point, there simply
> >>>> hasn't been a need yet. GUIManager.py imports DBInterface, and handles
> >>>> all the GUI stuff, as the name suggests. It's where, eventually, I'll
> >>>> take user input and use it to update records by calling functions from
> >>>> DBInterface. That's the problem, though. In GUIManager, I have a
> >>>> simple test:
> >>>>
> >>>> self.records[self.selectedRecordIndex].name="test name" #records is
> >>>> the list of objects returned by querying the current table
> >>>>
> >>>> Which errors out every time:
> >>>> AttributeError: can't set attribute
> >>>>
> >>>> (Yes, "name" is an attribute name of my Customer class.) From what
> >>>> I've read thus far, updating records is as easy as modifying their
> >>>> properties and calling session.commit(). That isn't working, though. I
> >>>> imagine the problem is that the records in a query aren't the same as
> >>>> the records originally created, and modify/commit only works on those
> >>>> originals. I'm not sure if that's right, though. If it is, how could I
> >>>> modify the originals, given that I run a new query each time the user
> >>>> selects a table name in my GUI's list of names? If I'm wrong, how
> >>>> would I update the record attributes and save the changes back to the
> >>>> database? I think I'm picturing this whole thing wrong, to be honest.
> >>>> Thanks for any help, and please let me know if I need to provide more
> >>>> code or context.
> >>> Is your query against a single mapped class, or is it against some set
> of
> >>> columns? What do you get if you write:
> >>>
> >>> print type(self.records[self.selectedRecordIndex])
> >>> print repr(self.records[self.selectedRecordIndex])
> >>>
> >>> ...at the point where you are trying to set the name?
> >>>
> >>> Simon
> >>>
> >>> --
> >>> You received this message because you are subscribed to the Google
> Groups
> >>> "sqlalchemy" group.
> >>> To unsubscribe from this group and stop receiving emails from it, send
> an
> >>> email to sqlalchemy+unsubscr...@googlegroups.com.
> >>> To post to this group, send email to sqlalchemy@googlegroups.com.
> >>> Visit this group at https://groups.google.com/group/sqlalchemy.
> >>> For more options, visit https://groups.google.com/d/optout.
> >>
> >> --
> >> You received this message because you are subscribed to the Google
> Groups "sqlalchemy" group.
> >> To unsubscribe from this group and stop receiving emails from it, send
> an email to sqlalchemy+unsubscr...@googlegroups.com.
> >> To post to this group, send email to sqlalchemy@googlegroups.com.
> >> Visit this group at https://groups.google.com/group/sqlalchemy.
> >> For more options, visit https://groups.google.com/d/optout.
> >
> > --
> > You received this message because you are subscribed to the Google
> Groups "sqlalchemy" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> an email to sqlalchemy+unsubscr...@googlegroups.com.
> > To post to this group, send email to sqlalchemy@googlegroups.com.
> > Visit this group at https://groups.google.com/group/sqlalchemy.
> > For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to