[sqlalchemy] Selecting across columns with func.min()

2013-08-19 Thread csdrane
Hi all,

I've searched through the documentation and google on this and haven't been 
able to find an answer. I have the following class:

class Price(Base):
__tablename__ = prices
id = Column(Integer, primary_key = True)
company_id = Column(Integer, ForeignKey('companies.id'))
date = Column(DateTime, nullable=False)
close = Column(Float)

I'm trying to query Price for the minimum price during a certain period of 
time. The query for that is:

session.query(func.min(Price.close)).join(Company).filter(and_(Company.ticker==AAPL,
 
Price.date=datetime object)).one()

But, how does one query the Price.date that corresponds to 
func.min(Price.close)? I had thought I could do session.query(Price.date, 
func.min(Price.close)... but that instead returned the first date in the 
column alongside the min price. 

I also thought that I could do:

session.query(Price.date).join(Company).filter(Company.ticker==AAPL).having(func.min(Price.adj_close)==low[0]).all()

But that returns the empty set for some reason. (Just as well--there has to 
be an easier way to do this.)

Chris

-- 
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.


Re: [sqlalchemy] Updating a one-to-many relationship

2013-08-15 Thread csdrane
Thanks Simon -- that's what I was missing. 

On Thursday, August 15, 2013 5:01:31 AM UTC-4, Simon King wrote:

 (Sorry for any mistakes, I'm on my phone)

 Think of the database structure that you've got: your creators table has 
 id, creator and company_id columns. company_id is a foreign key 
 pointing at the id column of the companies table.

 This means that a single row in the creators table can only point at one 
 company. Also, multiple creators can point at the same company. In other 
 words, your many-to-one relationship is probably the opposite way round 
 from the way you've intended. SQLAlchemy uses the foreign keys to determine 
 the direction of the relationship, and so this is why Company.creator is a 
 list, and you are only ever seeing a single value stored for 
 Creator.companies.

 You probably want to remove the creators.company_id column and put a 
 creator_id column on the companies table instead. This will mean that 
 each company points at a single creator, but multiple companies may point 
 at the same creator. In SQLAlchemy terms, Company.creator will now be a 
 scalar value rather than a list, and Creator.companies will be a list.

 (Note that this means you'll need to change the code in your 
 Company.__init__ method so that it assigns to self.creator rather than 
 appending to it, and get rid of all the [0] indexing and so on)

 Hope that helps,

 Simon

 On 15 Aug 2013, at 02:12, csd...@gmail.com javascript: 
 csd...@gmail.com javascript: wrote:

 Simon, your idea about putting together a script is a good one. Please see 
 the attached. I think all these errors are related but I'm scratching my 
 head about what the problem is. 

 The reason I use self.creator[0] versus self.creator is for aesthetics. 
 And, to your point about creator not being a list, SQLAlchemy is treating 
 creator as a list-like object. Since any company can only have one creator, 
 I wasn't concerned about indexing creator[0]. 

  a=session.query(Company).first()
  a
 Company1, created by mike

 rather than

  a=session.query(Company).first()
  a
 Company1, created by [mike]
  a.creator
 [mike]

 More info on creator:

  type(a.creator)
 class 'sqlalchemy.orm.collections.InstrumentedList'
  type(a.creator[0])
 class '__main__.Creator'

 Chris

 On Wednesday, August 14, 2013 6:18:51 AM UTC-4, Simon King wrote:

 I think you may be confused about the relationship properties you have 
 here. As far as I can tell, a Creator can have many companies, but 
 each Company has only one creator, correct? So Company.creator should 
 only ever be an instance of Creator (or None), whereas 
 Creator.companies should be a list. 

 In your __repr__ example: 

 class Creator(Base): 
 def __repr__(self): 
 return '%s' % self.creator 

 class Company(Base): 
 def __repr__(self): 
 return '%s, created by %s' % (self.company, self.creator[0]) 

 Why are you using self.creator[0] here? self.creator is not a list, 
 it should either be an instance of Creator, or None. 

 Overriding __repr__ is also a good way to make debugging difficult. 
 For example, if you had a list of Creator instances and you printed 
 them at the python prompt, it would just look like a list of strings. 
 When I want extra information from __repr__, I normally write it 
 something like this: 

 def __repr__(self): 
 classname = type(self).__name__ 
 return '%s name=%r' % (classname, self.name) 

 In your second example: 

  a=session.query(Creator).first() 
  a[0].companies 
  a.companies 

 Query.first() returns a single value, not a list. So typing a[0] 
 doesn't make any sense. 

 Please try to create a self-contained script that demonstrates your 
 problem. Here is a good example: 

 https://groups.google.com/d/msg/sqlalchemy/jQtIRJXVfH8/LgwX-bomEIQJ 

 Thanks, 

 Simon 

 On Wed, Aug 14, 2013 at 2:45 AM,  csd...@gmail.com wrote: 
  I'm afraid there are still some bugs in here that hopefully you can 
 help 
  with. 
  
  class Creator(Base): 
  __tablename__ = creators 
  id = Column(Integer, primary_key = True) 
  company_id = Column(Integer, ForeignKey('companies.id')) 
  creator = Column(String(100), nullable=False, unique=True) 
  def __init__(self, creator): 
  self.creator = creator 
  def __repr__(self): 
  return '%s' % self.creator # otherwise returns a single entry 
 list 
  for some reason (e.g. would display [user]) 
  
  class Company(Base): 
  __tablename__ = companies 
  id = Column(Integer, primary_key = True) 
  company = Column(String(100), unique=True, nullable=False) #might 
 want 
  to revise string sizes at some point 
  creator = relationship(Creator, backref=companies, 
 cascade=all) 
  def __init__(self, company, creator): 
  self.company = company 
  #self.creator.append(Creator(creator)) 
  existing_creator = 
  session.query(Creator).filter_by(creator=creator).first() 
  

Re: [sqlalchemy] Updating a one-to-many relationship

2013-08-14 Thread csdrane
Simon, your idea about putting together a script is a good one. Please see 
the attached. I think all these errors are related but I'm scratching my 
head about what the problem is. 

The reason I use self.creator[0] versus self.creator is for aesthetics. 
And, to your point about creator not being a list, SQLAlchemy is treating 
creator as a list-like object. Since any company can only have one creator, 
I wasn't concerned about indexing creator[0]. 

 a=session.query(Company).first()
 a
Company1, created by mike

rather than

 a=session.query(Company).first()
 a
Company1, created by [mike]
 a.creator
[mike]

More info on creator:

 type(a.creator)
class 'sqlalchemy.orm.collections.InstrumentedList'
 type(a.creator[0])
class '__main__.Creator'

Chris

On Wednesday, August 14, 2013 6:18:51 AM UTC-4, Simon King wrote:

 I think you may be confused about the relationship properties you have 
 here. As far as I can tell, a Creator can have many companies, but 
 each Company has only one creator, correct? So Company.creator should 
 only ever be an instance of Creator (or None), whereas 
 Creator.companies should be a list. 

 In your __repr__ example: 

 class Creator(Base): 
 def __repr__(self): 
 return '%s' % self.creator 

 class Company(Base): 
 def __repr__(self): 
 return '%s, created by %s' % (self.company, self.creator[0]) 

 Why are you using self.creator[0] here? self.creator is not a list, 
 it should either be an instance of Creator, or None. 

 Overriding __repr__ is also a good way to make debugging difficult. 
 For example, if you had a list of Creator instances and you printed 
 them at the python prompt, it would just look like a list of strings. 
 When I want extra information from __repr__, I normally write it 
 something like this: 

 def __repr__(self): 
 classname = type(self).__name__ 
 return '%s name=%r' % (classname, self.name) 

 In your second example: 

  a=session.query(Creator).first() 
  a[0].companies 
  a.companies 

 Query.first() returns a single value, not a list. So typing a[0] 
 doesn't make any sense. 

 Please try to create a self-contained script that demonstrates your 
 problem. Here is a good example: 

 https://groups.google.com/d/msg/sqlalchemy/jQtIRJXVfH8/LgwX-bomEIQJ 

 Thanks, 

 Simon 

 On Wed, Aug 14, 2013 at 2:45 AM,  csd...@gmail.com javascript: wrote: 
  I'm afraid there are still some bugs in here that hopefully you can help 
  with. 
  
  class Creator(Base): 
  __tablename__ = creators 
  id = Column(Integer, primary_key = True) 
  company_id = Column(Integer, ForeignKey('companies.id')) 
  creator = Column(String(100), nullable=False, unique=True) 
  def __init__(self, creator): 
  self.creator = creator 
  def __repr__(self): 
  return '%s' % self.creator # otherwise returns a single entry 
 list 
  for some reason (e.g. would display [user]) 
  
  class Company(Base): 
  __tablename__ = companies 
  id = Column(Integer, primary_key = True) 
  company = Column(String(100), unique=True, nullable=False) #might 
 want 
  to revise string sizes at some point 
  creator = relationship(Creator, backref=companies, 
 cascade=all) 
  def __init__(self, company, creator): 
  self.company = company 
  #self.creator.append(Creator(creator)) 
  existing_creator = 
  session.query(Creator).filter_by(creator=creator).first() 
  #self.creator.append(existing_creator or Creator(creator)) 
  if existing_creator: 
  print True 
  self.creator.append(existing_creator) 
  else: 
  self.creator.append(Creator(creator)) 
  def __repr__(self): 
  return '%s, created by %s' % (self.company, self.creator[0]) 
  
  
  
  1) Weird __repr__ error: 
  
  class Creator(Base): 
  def __repr__(self): 
  return '%s' % self.creator 
  
  class Company(Base): 
  def __repr__(self): 
  return '%s, created by %s' % (self.company, self.creator[0]) 
  
  c=Company(Company1, mike) 
  session.add(c) 
  c=Company(Company2, mike) 
  True 
  session.add(c) 
  c=Company(Company3, john) 
  session.add(c) 
  c=Company(Company4, mike) 
  True 
  session.add(c) 
  session.query(Company).all() 
  [Traceback (most recent call last): 
File stdin, line 1, in module 
File stdin, line 17, in __repr__ 
  
  
  However, if I divide the query lines among every add() statement, there 
 is 
  no __repr__ error. 
  
  c=Company(Company1, mike) 
  session.add(c) 
  session.query(Company).all() 
  [Company1, created by mike] 
  c=Company(Company2, mike) 
  True 
  session.add(c) 
  session.query(Company).all() 
  [Company1, created by mike, Company2, created by mike] 
  c=Company(Company3, john) 
  session.add(c) 
  session.query(Company).all() 
  [Company1, created by mike, Company2, created by mike, Company3, created 
 by 
  john] 
  c=Company(Company4, mike) 
  True 
  session.add(c) 
  

Re: [sqlalchemy] Updating a one-to-many relationship

2013-08-13 Thread csdrane
I'm afraid there are still some bugs in here that hopefully you can help 
with.

class Creator(Base):
__tablename__ = creators
id = Column(Integer, primary_key = True)
company_id = Column(Integer, ForeignKey('companies.id'))
creator = Column(String(100), nullable=False, unique=True)
def __init__(self, creator):
self.creator = creator
def __repr__(self):
return '%s' % self.creator # otherwise returns a single entry list 
for some reason (e.g. would display [user])

class Company(Base):
__tablename__ = companies
id = Column(Integer, primary_key = True)
company = Column(String(100), unique=True, nullable=False) #might want 
to revise string sizes at some point
creator = relationship(Creator, backref=companies, cascade=all)
def __init__(self, company, creator):
self.company = company
#self.creator.append(Creator(creator))
existing_creator = 
session.query(Creator).filter_by(creator=creator).first()
#self.creator.append(existing_creator or Creator(creator))
if existing_creator:
print True
self.creator.append(existing_creator)
else:
self.creator.append(Creator(creator))
def __repr__(self):
return '%s, created by %s' % (self.company, self.creator[0])



1) Weird __repr__ error:

class Creator(Base):
def __repr__(self):
return '%s' % self.creator

class Company(Base):
def __repr__(self):
return '%s, created by %s' % (self.company, self.creator[0])

 c=Company(Company1, mike)
 session.add(c)
 c=Company(Company2, mike)
True
 session.add(c)
 c=Company(Company3, john)
 session.add(c)
 c=Company(Company4, mike)
True
 session.add(c)
 session.query(Company).all()
[Traceback (most recent call last):
  File stdin, line 1, in module
  File stdin, line 17, in __repr__


However, if I divide the query lines among every add() statement, there is 
no __repr__ error. 

 c=Company(Company1, mike)
 session.add(c)
 session.query(Company).all()
[Company1, created by mike]
 c=Company(Company2, mike)
True
 session.add(c)
 session.query(Company).all()
[Company1, created by mike, Company2, created by mike]
 c=Company(Company3, john)
 session.add(c)
 session.query(Company).all()
[Company1, created by mike, Company2, created by mike, Company3, created by 
john]
 c=Company(Company4, mike)
True
 session.add(c)
 session.query(Company).all()
[Company1, created by mike, Company2, created by mike, Company3, created by 
john, Company4, created by mike]


2) Creator.companies only shows the most recently added company:

 session.query(Company).all()
[Company1, created by mike, Company2, created by mike, Company3, created by 
john, Company4, created by mike]
 session.query(Creator).all()
[mike, john]
 a=session.query(Creator).first()
 a[0].companies
 a.companies
Company4, created by mike


3) Weird Company.creator error:

 session.query(Company).all()
[Company1, created by mike, Company2, created by mike, Company3, created by 
john, Company4, created by mike]
 session.query(Company.creator).all()
[(False,), (False,), (False,), (False,), (True,), (False,), (False,), 
(True,)]
 a=session.query(Company).first()
 a.creator
[mike]

Anyone have any ideas?

-- 
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.




Re: [sqlalchemy] Issue with session.expunge with mutually dependent tables

2013-08-12 Thread csdrane
Thanks Michael!

On Sunday, August 11, 2013 4:33:20 PM UTC-4, Michael Bayer wrote:


 On Aug 11, 2013, at 3:06 PM, csd...@gmail.com javascript: wrote:

 I'm having problem with the following code which is designed to remove an 
 object identified as malformed prior to session.commit():

 if tickers[x] not in existing_tickers and company_names[x] not in 
 existing_companies:
 company = Company(tickers[x], company_names[x], creators[x], links[x])
 session.add(company)
 new_companies.append(company)

 bad_ticks = []
 for company in new_companies:
 if company.get_prices() == False:
 bad_ticks.append(company)
 for tick in bad_ticks:
 session.expunge(tick)
 session.commit()

 I receive the following error:

 /Library/Python/2.7/site-packages/sqlalchemy/orm/dependency.py:746: 
 SAWarning: Object of type Company not in session, add operation along 
 'Creator.companies' won't proceed
   uowcommit, add)


 this is not an error, it's a warning.  It means you have a Company object 
 inside of the companies collection of a Creator; the Creator object is 
 being flushed.   However, as the unit of work traverses the companies 
 collection, it will skip this particular Company object since it is not 
 part of this Session and continue with the rest of the collection.   
 There's no error, it's just a warning that this might not be what you want.



 My guess is that the Company is getting expunged from the session but the 
 corresponding Creator isn't, 


 if you want Creator to be expunged when a collected Company is expunged, 
 you'd need to add the expunge cascade to the Company.creator relationship:

 class Company(Base):
 # ...

 creator = relationship(Creator, cascade=save-update, merge, 
 expunge, ...)






-- 
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.




[sqlalchemy] Updating a one-to-many relationship

2013-08-12 Thread csdrane
I have another question about a piece of code that I posted the other day. 
Namely, I have a one-to-many relationship between Creator and Company. A 
Creator can have a relationship with multiple Companies but any one Company 
can have a relationship with only one Creator.

class Company(Base):
__tablename__ = companies
id = Column(Integer, primary_key = True)
company = Column(String(100), unique=True, nullable=False)
creator = relationship(Creator, backref=companies, cascade=all)
def __init__(self, company, creator):
self.company = company
self.creator.append(Creator(creator))

class Creator(Base):
__tablename__ = creators
company_id = Column(Integer, ForeignKey('companies.id'))
creator = Column(String(100), nullable=False, unique=True)
def __init__(self, creator):
self.creator = creator

So, to create a Company, the code calls company = Company(company name, 
creator name) and that in turn calls Creator().

The problem is that the Companies get added one by one, and if a new 
company being entered has a Creator with a name of a preexisting company, 
SQLalchemy errors due to the unique=True flag:

sqlalchemy.exc.IntegrityError: (IntegrityError) (1062, Duplicate entry 
'Viking' for key 'creator') 'INSERT INTO creators (company_id, creator) 
VALUES (%s, %s)' (17L, u'Viking')

If unique=True isn't enabled, it will create another Creator of the same 
name. Instead, the code should reflect the additional Company assigned to 
this particular Creator. How might I go about fixing this?

Thanks!

-- 
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.




Re: [sqlalchemy] Updating a one-to-many relationship

2013-08-12 Thread csdrane
Sorry I don't understand what you're trying to say. 

If the Creator already exists, and I'm to append it again, isn't that the 
same as what my code is currently doing? (That is, appending in every 
instance.) I don't see how this wouldn't result in the same error message.

And what would it mean to create a new one and append that? I don't know 
what this code would look like.

Apologies if I'm being dense.

On Monday, August 12, 2013 9:33:31 PM UTC-4, Tim wrote:

 In `Company.__init__()`, instead of blindly creating a new `Creator` 
 instance, you need to first query for an existing Creator with that name. 
 If it exists, append it, otherwise, create a new one and append that. 

 -- 
 Tim Van Steenburgh

 On Monday, August 12, 2013 at 9:26 PM, csd...@gmail.com javascript:wrote:

 I have another question about a piece of code that I posted the other day. 
 Namely, I have a one-to-many relationship between Creator and Company. A 
 Creator can have a relationship with multiple Companies but any one Company 
 can have a relationship with only one Creator.

 class Company(Base):
 __tablename__ = companies
 id = Column(Integer, primary_key = True)
 company = Column(String(100), unique=True, nullable=False)
 creator = relationship(Creator, backref=companies, cascade=all)
 def __init__(self, company, creator):
 self.company = company
 self.creator.append(Creator(creator))

 class Creator(Base):
 __tablename__ = creators
 company_id = Column(Integer, ForeignKey('companies.id'))
 creator = Column(String(100), nullable=False, unique=True)
 def __init__(self, creator):
 self.creator = creator

 So, to create a Company, the code calls company = Company(company name, 
 creator name) and that in turn calls Creator().

 The problem is that the Companies get added one by one, and if a new 
 company being entered has a Creator with a name of a preexisting company, 
 SQLalchemy errors due to the unique=True flag:

 sqlalchemy.exc.IntegrityError: (IntegrityError) (1062, Duplicate entry 
 'Viking' for key 'creator') 'INSERT INTO creators (company_id, creator) 
 VALUES (%s, %s)' (17L, u'Viking')

 If unique=True isn't enabled, it will create another Creator of the same 
 name. Instead, the code should reflect the additional Company assigned to 
 this particular Creator. How might I go about fixing this?

 Thanks!

 -- 
 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+...@googlegroups.com javascript:.
 To post to this group, send email to sqlal...@googlegroups.comjavascript:
 .
 Visit this group at http://groups.google.com/group/sqlalchemy.
 For more options, visit https://groups.google.com/groups/opt_out.
  
  
  
  
  

-- 
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.




Re: [sqlalchemy] Updating a one-to-many relationship

2013-08-12 Thread csdrane
Very helpful, thanks Tim :)

On Monday, August 12, 2013 9:53:48 PM UTC-4, Tim wrote:

  Ad, one more try: 

 existing_creator = DBSession.query(Creator).filter_by(name=creator).first()

 -- 
 Tim Van Steenburgh

 On Monday, August 12, 2013 at 9:50 PM, Tim Van Steenburgh wrote:

  Sorry, that should have been: 

 existing_creator = 
 DBSession(Creator).query.filter_by(creator=creator).first()

 On Monday, August 12, 2013 at 9:49 PM, Tim Van Steenburgh wrote:

  It's not the append that's causing the error, it's the fact that you're 
 creating a new Creator() instance, which ultimately results in an INSERT 
 statement being issued. 

 You want to append a Creator instance to `company.creator`, but you don't 
 necessarily want to make a new Creator every time you instantiate a 
 Company. If a Creator with the given name already exists, you'll want use 
 that instead.

 So, roughly:

 class Company(Base):
 __tablename__ = companies
 id = Column(Integer, primary_key = True)
 company = Column(String(100), unique=True, nullable=False)
 creator = relationship(Creator, backref=companies, cascade=all)
 def __init__(self, company, creator):
 self.company = company
   existing_creator = 
 DBSession(Creator).query.filter_by(name=creator).first()
 self.creator.append(existing_creator or Creator(creator))

 -- 
 Tim Van Steenburgh


 On Monday, August 12, 2013 at 9:41 PM, csd...@gmail.com javascript:wrote:

 Sorry I don't understand what you're trying to say. 

 If the Creator already exists, and I'm to append it again, isn't that the 
 same as what my code is currently doing? (That is, appending in every 
 instance.) I don't see how this wouldn't result in the same error message.

 And what would it mean to create a new one and append that? I don't know 
 what this code would look like.

 Apologies if I'm being dense.

 On Monday, August 12, 2013 9:33:31 PM UTC-4, Tim wrote:

 In `Company.__init__()`, instead of blindly creating a new `Creator` 
 instance, you need to first query for an existing Creator with that name. 
 If it exists, append it, otherwise, create a new one and append that. 

 -- 
 Tim Van Steenburgh

 On Monday, August 12, 2013 at 9:26 PM, csd...@gmail.com wrote:

 I have another question about a piece of code that I posted the other day. 
 Namely, I have a one-to-many relationship between Creator and Company. A 
 Creator can have a relationship with multiple Companies but any one Company 
 can have a relationship with only one Creator.

 class Company(Base):
 __tablename__ = companies
 id = Column(Integer, primary_key = True)
 company = Column(String(100), unique=True, nullable=False)
 creator = relationship(Creator, backref=companies, cascade=all)
 def __init__(self, company, creator):
 self.company = company
 self.creator.append(Creator(creator))

 class Creator(Base):
 __tablename__ = creators
 company_id = Column(Integer, ForeignKey('companies.id'))
 creator = Column(String(100), nullable=False, unique=True)
 def __init__(self, creator):
 self.creator = creator

 So, to create a Company, the code calls company = Company(company name, 
 creator name) and that in turn calls Creator().

 The problem is that the Companies get added one by one, and if a new 
 company being entered has a Creator with a name of a preexisting company, 
 SQLalchemy errors due to the unique=True flag:

 sqlalchemy.exc.IntegrityError: (IntegrityError) (1062, Duplicate entry 
 'Viking' for key 'creator') 'INSERT INTO creators (company_id, creator) 
 VALUES (%s, %s)' (17L, u'Viking')

 If unique=True isn't enabled, it will create another Creator of the same 
 name. Instead, the code should reflect the additional Company assigned to 
 this particular Creator. How might I go about fixing this?

 Thanks!

 -- 
 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+...@googlegroups.com.
 To post to this group, send email to sqlal...@googlegroups.com.
 Visit this group at http://groups.google.com/group/sqlalchemy.
 For more options, visit https://groups.google.com/groups/opt_out.
  
  
  

   -- 
 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+...@googlegroups.com javascript:.
 To post to this group, send email to sqlal...@googlegroups.comjavascript:
 .
 Visit this group at http://groups.google.com/group/sqlalchemy.
 For more options, visit https://groups.google.com/groups/opt_out.
  
  
  

   
   
  

-- 
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] Issue with session.expunge with mutually dependent tables

2013-08-11 Thread csdrane
I'm having problem with the following code which is designed to remove an 
object identified as malformed prior to session.commit():

if tickers[x] not in existing_tickers and company_names[x] not in 
existing_companies:
company = Company(tickers[x], company_names[x], creators[x], links[x])
session.add(company)
new_companies.append(company)

bad_ticks = []
for company in new_companies:
if company.get_prices() == False:
bad_ticks.append(company)
for tick in bad_ticks:
session.expunge(tick)
session.commit()

I receive the following error:

/Library/Python/2.7/site-packages/sqlalchemy/orm/dependency.py:746: 
SAWarning: Object of type Company not in session, add operation along 
'Creator.companies' won't proceed
  uowcommit, add)

Class Company() has a relationship with Class Creator() (referenced in 
error message). The relationship between Company and Creator is summarized 
briefly as follows:

class Company(Base):
__tablename__ = companies
creator = relationship(Creator, backref=companies)
def __init__(self, ticker, company, creator, link):
self.creator.append(Creator(creator))

class Creator(Base):
__tablename__ = creators
company_id = Column(Integer, ForeignKey('companies.id'))
creator = Column(String(100), nullable=False)

A Creator can have a relationship with multiple Companies but any one 
Company can have a relationship with only one Creator.

My guess is that the Company is getting expunged from the session but the 
corresponding Creator isn't, and that's confusing MySql and/or sqlalchemy. 
However, I don't know how to try to expunge the Creator object since it's 
only ever called within the Company class. Anyone know the proper way to 
fix this?

Thanks,

Chris

-- 
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.


Re: [sqlalchemy] Creating one-to-many relationship: child class returns empty list after trying to enter data

2013-08-10 Thread csdrane
Thank you! That worked.

On Saturday, August 10, 2013 5:39:31 AM UTC-4, Simon King wrote:


 On 10 Aug 2013, at 03:42, csd...@gmail.com javascript: wrote: 

  This is driving me a little crazy so hopefully someone here can help. 
 This is my first time working with sqlalchemy (v0.8). Python is v2.7.2 and 
 MySQL is v14.14. 
  
  The (heavily) summarized code is as follows: 
  
  class Price(Base): 
  __tablename__ = prices 
  id = Column(Integer, primary_key = True) 
  company_id = Column(Integer, ForeignKey('companies.id')) 
  date = Column(DateTime) 
  close = Column(Float) 
  volume = Column(Integer) 
  
  def __init__(self, date, close, volume): 
  self.date = date 
  self.close = close 
  self.volume = volume 
  
  class Company(Base): 
  __tablename__ = companies 
  id = Column(Integer, primary_key = True) 
  ticker = Column(String(10)) 
  company = Column(String(100)) 
  prices = relationship(Price) 
  def __init__(self, ticker, company): 
  self.ticker = ticker 
  self.company = company 
  def get_prices(self): 
  csv_data = get_csv() 
  for row in csv_data: 
  date = row[0].strip() 
  date = datetime.datetime.strptime(date, '%Y-%m-%d') 
  close = float(row[4]) 
  volume = int(row[5]) 
  prices = Price(date = date, close = close, volume = volume) 
  session.add(prices) 
  
  So, what the code should do is have a table of companies and a table of 
 daily pricing data on all companies. I want to be able to access the prices 
 via company.prices. Instead, when I try to do this, Python returns an empty 
 list []. I know that the data is getting picked up somewhere because I see 
 the SQL activity when I do session.commit(). I've also tried modifying the 
 get_prices() function by changing the prices variable to a list + append() 
 and then at the end of the for loop doing a session.add_all(prices), but 
 that didn't work either. What am I doing incorrectly? 
  
  Thanks, 
  
  Chris 

 You haven't associated your Price instances with the Company instance. If 
 you looked at the database, all the company_id values would be NULL. 

 If you put self.prices.append(prices) as the last line of your loop, it 
 should all work. In fact, if you do that, the session.add will be 
 unnecessary because the prices will be automatically added to the session 
 (assuming that the company is already in the session). 

 Hope that helps, 

 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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.


[sqlalchemy] Creating one-to-many relationship: child class returns empty list after trying to enter data

2013-08-09 Thread csdrane
This is driving me a little crazy so hopefully someone here can help. This 
is my first time working with sqlalchemy (v0.8). Python is v2.7.2 and MySQL 
is v14.14. 

The (heavily) summarized code is as follows: 

class Price(Base):
__tablename__ = prices
id = Column(Integer, primary_key = True)
company_id = Column(Integer, ForeignKey('companies.id'))
date = Column(DateTime)
close = Column(Float)
volume = Column(Integer)

def __init__(self, date, close, volume):
self.date = date
self.close = close
self.volume = volume

class Company(Base):
__tablename__ = companies
id = Column(Integer, primary_key = True)
ticker = Column(String(10))
company = Column(String(100))
prices = relationship(Price)
def __init__(self, ticker, company):
self.ticker = ticker
self.company = company
def get_prices(self):
csv_data = get_csv()
for row in csv_data:
date = row[0].strip()
date = datetime.datetime.strptime(date, '%Y-%m-%d')
close = float(row[4])
volume = int(row[5])
prices = Price(date = date, close = close, volume = volume)
session.add(prices)

So, what the code* *should do is have a table of companies and a table of 
daily pricing data on all companies. I want to be able to access the prices 
via company.prices. Instead, when I try to do this, Python returns an empty 
list []. I know that the data is getting picked up somewhere because I see 
the SQL activity when I do session.commit(). I've also tried modifying the 
get_prices() function by changing the prices variable to a list + append() and 
then at the end of the for loop doing a session.add_all(prices), but that 
didn't work either. What am I doing incorrectly?

Thanks,

Chris

-- 
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.