This is where sqlalchemy gets murky for me. If I return all classes,
I'm not returning all *instances* of those classes. How, then, would I
update a given customer's record? The objects (c1 and c2, for
instance) were instantiated elsewhere, and my GUIManager module has no
knowledge of them. More generally, when I switch this over to our
AS400 and start querying, I won't have created any records at all.
Every record will be pulled from a table on the 400, and while I will
have a schema, I won't have any instances of that schema.

As I think about this, it occurs to me that I should *create* the
record objects from the records. That is:

for record in recordsList: #an array of session.query(someTable).all()
 myTempRecord = mySchemaClass(record)
 myTempRecord.property = newValue
#update the database

Assuming GUIManager knows about mySchemaClass, would that approach
work? How I'd pass in a record and get back an instance of
mySchemaClass I'm not yet sure, but is this worth looking into more,
or am I on the wrong track?

On 2/4/16, Simon King <si...@simonking.org.uk> wrote:
> getAllTables is returning Core Table objects. I suppose you could have a
> similar function which returns all mapped classes, something like this:
>
> def getAllClasses():
>     return base.__subclasses__()
>
> (If your class hierarchy is more complicated you'd need a more
> sophisticated function there)
>
> Simon
>
> On Thu, Feb 4, 2016 at 12:32 PM, Alex Hall <ah...@autodist.com> wrote:
>
>> Yes, I'm using Declarative. I was following a great tutorial, then
>> realized it was way out of date. The one recommended on the forum I
>> found said to use Declarative, so I did.
>>
>> In DBInterface, I have this little function:
>>
>> def getAllTables():
>>  return base.metadata.tables
>> #end def getAllTables
>>
>> I then loop over that array, grabbing the value only and ignoring the
>> key. I just tried printing the type, as in:
>>
>> def getAllTables():
>>  for table in base.metadata.tables.values():
>>   print type(table)
>>  return base.metadata.tables
>> #end def getAllTables
>>
>> I got <class 'sqlalchemy.sql.schema.Table'> Here's the loop that
>> generates the table list passed to my GUI (remember that this must be
>> an array of arrays):
>>
>>   tables = DBInterface.getAllTables()
>>   tablesList = []
>>   for table in tables.values():
>>    tablesList.append([table])
>>   #end for
>>
>> Just to be sure, I stuck a "print type(table)" statement in that for
>> loop, and the objects are still sqlalchemy.sql.schema.Table objects.
>>
>> On 2/4/16, Simon King <si...@simonking.org.uk> wrote:
>> > 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.
>> >
>>
>> --
>> 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