I was re-reading your email, and realized I forgot to answer something (sorry, it's early here). It looks like I am indeed passing the table to session.query, which works, but then I'm trying to change attributes of the table, which doesn't (of course). Could I do this?
#DBDefinitions.py import sqlalchemy from sqlalchemy.ext.declarative import declarative_base base = declarative_base() class Customer(base): ...... class MyOtherTable(base): ...... #DDInterface.py import DBDefinitions import sqlalchemy #set up the database--session, engine, etc DBDefinitions.base.metadata.create_all(myEngine) #should create the empty tables, right? #main.py from DBDefinitions import * import DBInterface c1 = Customer(...) c2 = Customer(...) mt1 = MyOtherTable(...) if DBInterface.session.query(DBDefinitions.Customer).count == 0: DBInterface.session.add_all([c1, c2]) On 2/4/16, 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.