SQLAlchemy 0.9.6 Released

2014-06-23 Thread Mike Bayer
Hey folks -

Building on the great success of 0.9.5 just a few hours ago today, 0.9.6
is out!   One of the changes in 0.9.5 had more of an impact than
expected and I determined it was better just reverting this particular
change, as there's a much better solution to it on deck for version 1.0
- this change involved whether or not the None value implicitly
created when you do an attribute get should impact the flush process,
and it was driven by the edge case of the so-called row switch
scenario when an INSERT/DELETE pair is turned into an UPDATE.  In 1.0,
at the moment it looks like the approach will be to do away with the
implicit set of None when you fetch a missing attribute; you'll still
get the None but the underlying state won't be changed.

For details see issue #3060 and #3061.

Download SQLAlchemy 0.9.6 at:

http://www.sqlalchemy.org/download.html


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


Re: [sqlalchemy] Could not locate column in row for column

2014-06-23 Thread Timur Ozheghin
Hello, Mike

thank you for your answer
for now it works fine with the patch create_engine(
description_encoding = 'utf8')


2014-06-20 22:36 GMT+04:00 Mike Bayer mike...@zzzcomputing.com:


 On 6/20/14, 12:14 PM, Mike Bayer wrote:
  On 6/20/14, 7:32 AM, Mike Bayer wrote:
  NoSuchColumnError: Could not locate column in row for column
 
 '\\u0417\\u0430\\u043a\\u0430\\u0437\\u044b.\\u041d\\u043e\\u043c\\u0435\\u0440
  \\u0437\\u0430\\u043a\\u0430\\u0437\\u0430'
 
  The problem is i can't really debug this error because it isn't clear
  what should be in pk_cols
 
  Previously in orm/loading.py there is a string
  pk_cols = mapper.primary_key # line number 250
 
  So, pk_cols is a list of Column() objects.
  row is a list of values from query
  Surely, [row[column] for column in pk_cols] raises error, because
  column is a Column() object and can't be index for row. But i can't
  imagine how this code may work. Is this a bug?
  the ResultProxy contains translation logic that receives Column objects
  and locates the data by name.  This is documented at
  http://docs.sqlalchemy.org/en/rel_0_9/core/tutorial.html#selecting and
  is the primary method by which the ORM relates mapped columns to result
  sets.
 
  In this case the issue is most likely yet another pyodbc + unicode
  encoding issue, of which there are many, and often there's no way to
  work around.  Need to know 1. OS platform 2. FreeTDS version 3. UnixODBC
  or iODBC (and what version) 4. pyodbc version 5. SQL Server version.   I
  can try to test but often these unicode issues aren't easy to resolve
  (have you tried pymssql? ).thanks.
  good news, I can reproduce this, and on my end at least it needs the
  so-called description_encoding workaround.   We may have to revisit
  the defaults on this parameter for modern versions of Pyodbc.  The test
  below produces your error without the param, resolves with it.   Please
  try this out on your create_engine(), thanks.
 
  #! coding: utf-8
 
  from sqlalchemy import *
 
  engine = create_engine(mssql+pyodbc://scott:tiger@ms_2008, echo=True,
  description_encoding='utf8')
 
  colname = u'Заказ.Номер заказа'
 
  m = MetaData()
  t = Table(uЗаказы, m, Column(colname, String(30), key='somecol'))
 
  m.drop_all(engine)
  m.create_all(engine)
 
  engine.execute(t.insert().values(somecol='some value'))
  result = engine.execute(t.select().where(t.c.somecol == 'some value'))
  row = result.fetchone()
  print row[t.c.somecol]
 yeah this is the workaround for now, but totally this is a bug back to
 0.8 and further, should be backported for 0.8, 0.9 and 1.0 in

 https://bitbucket.org/zzzeek/sqlalchemy/issue/3091/update-description_encoding-for-pyodbc
 .
 Two different issues located.

 --
 You received this message because you are subscribed to a topic in the
 Google Groups sqlalchemy group.
 To unsubscribe from this topic, visit
 https://groups.google.com/d/topic/sqlalchemy/svIe6UWMWyU/unsubscribe.
 To unsubscribe from this group and all its topics, 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/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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.


Re: [sqlalchemy] A question regarding hybrid properties, relationships and schema changes

2014-06-23 Thread Ken Lareau
On Fri, Jun 20, 2014 at 3:46 PM, Ken Lareau klar...@tagged.com wrote:

 On Fri, Jun 20, 2014 at 1:23 PM, Mike Bayer mike...@zzzcomputing.com
 wrote:


 On 6/20/14, 3:38 PM, Ken Lareau wrote:

  So in the ongoing improvement of one of our internal databases, we
 created
  a new table named 'environments' whose SQLA code looks something like
  this:

 class Environment(Base):
 __tablename__ = 'environments'

 id = Column(u'environmentID', INTEGER(), primary_key=True)
 environment = Column(String(length=15), nullable=False, unique=True)
 env = Column(String(length=12), nullable=False, unique=True)
 domain = Column(String(length=32), nullable=False, unique=True)
 prefix = Column(String(length=1), nullable=False)

  Two of our tables recently needed conversion to stop using their own
 local
  'environment' column to using this table.  The first part's been put in
 place
  (a new foreign key for 'environment_id'), but to prevent large swaths
 of code
  from needing changes, a thought of using a hybrid property might allow
 the
  change to be hidden (until the code using it had been rewritten at
 least).

  My naive attempt was the following (just the relevant snippet):

 environment_obj = relationship('Environment')

 @hybrid_property
 def environment(self):
 return self.environment_obj.environment

  Unfortunately (and in hindsight for obvious reasons), this code doesn't
 work,

 what does doesn't work mean here?   This will work at the instance
 level.  At the query level, not so much, that's true, if you truly want no
 code to change you'd need to implement an @expression here that's a little
 inefficient, as it needs to do a correlated subq:


 Yes, the doesn't work was specifically related to an attempt to use it in
 a query, which of course failed miserably. :)


  class HasEnv(Base):
 __tablename__ = 'has_env'

 id = Column(INTEGER, primary_key=True)
 environment_id = Column(ForeignKey('environments.environmentID'))


 environment_obj = relationship('Environment')

 @hybrid_property
 def environment(self):
 return self.environment_obj.environment

 @environment.expression
 def environment(cls):
 return select([Environment.environment]).\
 where(Environment.id ==
 cls.environment_id).correlate(cls).\
 as_scalar()


 s = Session()

 print s.query(HasEnv).filter(HasEnv.environment == 'some env')

 output:

 SELECT has_env.id AS has_env_id, has_env.environment_id AS
 has_env_environment_id
 FROM has_env
 WHERE (SELECT environments.environment
 FROM environments
 WHERE environments.environmentID = has_env.environment_id) = :param_1

 wont perform well from a SQL perspective but will do the job...



 This worked perfectly, thank you!  This is honestly a stop-gap measure
 to allow much of the code to be rewritten (after which it can be removed),
 and for what it's being used for at the moment, it won't be too bad
 regarding
 performance.



but a very brief conversation with someone on the #sqlalchemy channel
 on
  Freenode indicated there was no way to do this and all the relevant code
 must be reworked.  While it's only a few dozen places this occurs, I can
 see
 this coming up again in the future as further schema refactorings occur,
 so
  I turn to those with more expertise to find out if there is a way to
 accomplish
  what I desire, or if there's really no hope. :)  Any insight would be
 greatly
 appreciated.

 I don't know how to fix this issue with IRC and stackoverflow that people
 constantly are getting bad information.

 Heh, Sometimes I think I should know better about asking for help
 on IRC, but sometimes I get lucky.  In this case, I decided I might
 have better luck on the mailing list after the answer I got on IRC
 was very unsatisfactory. :)

 Thanks for the help!


D'oh, seems like I spoke too soon; there's a specific instance where
this fails due to some subquery stuff I'm doing:

if apptier:
subq = (
Session.query(
Package.pkg_name,
Package.version,
Package.revision,
AppDefinition.app_type,
AppDeployment.environment
).join(Deployment)
 .join(AppDeployment)
 .join(AppDefinition)
 .filter(Package.pkg_name == package_name)
 .filter(AppDeployment.environment == env)
 .filter(AppDeployment.status != 'invalidated'))

[...]

# The actual column name must be used in the subquery
# usage below; DB itself should be corrected
versions = (Session.query(subq.c.appType,
subq.c.version,
subq.c.revision)
.group_by(subq.c.appType, subq.c.environment)
.all())

The parts in the subquery work fine, but the access of the 'column'
in the final query leads to this:

Traceback (most recent call last):