Ran across something that I suspect might be a bug. If I define my
table like:
asset_table = Table('asset', metadata,
Column('path', Text, primary_key=True,
server_default=FetchedValue(),
server_onupdate=FetchedValue()),
autoload=True)
Then anytime I query for an asset and eagerload a related table the
backref on the related table isn't populated, causing a second query to
the DB.
If instead I define that column of type PGText then the backrefs are
populated properly. I attached a test which is a simplified version of
my table mappings.
Attached is a test of this behavior. The output when the column is
defined as Text or String looks like:
testshow/eps/201/s01/t01
testshow/chr/test/test
2009-09-24 17:17:03,214 INFO sqlalchemy.engine.base.Engine.0x...1f10
SELECT asset.updated AS asset_updated, asset.name AS asset_name,
asset.type AS asset_type, asset.path AS asset_path, asset.parent AS
asset_parent, asset.is_file AS asset_is_file, asset.created_by AS
asset_created_by
FROM asset
WHERE asset.path = %(param_1)s
2009-09-24 17:17:03,214 INFO sqlalchemy.engine.base.Engine.0x...1f10
{'param_1': 'testshow/eps/201/s01/t01'}
testshow/eps/201/s01/t01
When defined as PGText the output is:
testshow/eps/201/s01/t01
testshow/chr/test/test
testshow/eps/201/s01/t01
--
David Gardner
Pipeline Tools Programmer
Jim Henson Creature Shop
[email protected]
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---
import sys
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.types import *
from sqlalchemy.databases.postgres import PGText
DB_HOST = 'localhost'
DB_NAME = 'test_db'
DB_USER = 'testuser'
DB_PASS = 'testpass'
db_uri = 'postgres://%s:%...@%s/%s' % (DB_USER,DB_PASS,DB_HOST,DB_NAME)
db = create_engine (db_uri)
metadata = MetaData(db)
class Asset(object):
pass
class AssetRelation(object):
pass
#asset_table = Table('asset', metadata,autoload=True)
#asset_table = Table('asset', metadata,
# Column('path', Text, primary_key=True,
# server_default=FetchedValue(),
# server_onupdate=FetchedValue()),
# autoload=True)
asset_table = Table('asset', metadata,
Column('path', PGText, primary_key=True,
server_default=FetchedValue(),
server_onupdate=FetchedValue()),
autoload=True)
relation_table = Table('relation',metadata, autoload=True)
asset_mapper = mapper(Asset, asset_table,
properties = {
'Related' : relation(AssetRelation, backref='Source', primaryjoin=asset_table.c.path==relation_table.c.src_asset,order_by=relation_table.c.target_asset,lazy=True)
})
mapper(AssetRelation, relation_table, properties = {
'Target' : relation(Asset, backref='Relatee', primaryjoin=asset_table.c.path==relation_table.c.target_asset, viewonly=True,lazy=False)
})
session=create_session()
a=session.query(Asset).options(eagerload(Asset.Related)).get('testshow/eps/201/s01/t01')
db.echo=True
print a.path
r=a.Related[0]
print r.target_asset
b=r.Source
print b.path
session.close()
sys.exit(0)