FormAlchemy / formalchemy

MIT License
81 stars 29 forks source link

Does not work with SQLAlchemy 0.9 #56

Closed lvqier closed 10 years ago

lvqier commented 10 years ago

It seems that the SQLAlchemy 0.9 does neither provide Function nor _Function in package sqlalchemy.sql.expression. I meet import error when running FormAlchemy 1.4.3 with SQLAlchemy 0.9:

......
  File "/opt/webenv/local/lib/python2.7/site-packages/FormAlchemy-1.4.3-py2.7.egg/formalchemy/fields.py", line 1944, in render
    return AbstractField.render(self)
  File "/opt/webenv/local/lib/python2.7/site-packages/FormAlchemy-1.4.3-py2.7.egg/formalchemy/fields.py", line 1586, in render
    return self.renderer.render(**opts)
  File "/opt/webenv/local/lib/python2.7/site-packages/FormAlchemy-1.4.3-py2.7.egg/formalchemy/fields.py", line 446, in render
    return h.text_field(self.name, value=self.value, **kwargs)
  File "/opt/webenv/local/lib/python2.7/site-packages/FormAlchemy-1.4.3-py2.7.egg/formalchemy/fields.py", line 177, in value
    value = self.field.model_value
  File "/opt/webenv/local/lib/python2.7/site-packages/FormAlchemy-1.4.3-py2.7.egg/formalchemy/fields.py", line 1875, in model_value
    return self._pkify(self.raw_value)
  File "/opt/webenv/local/lib/python2.7/site-packages/FormAlchemy-1.4.3-py2.7.egg/formalchemy/fields.py", line 1894, in raw_value
    from sqlalchemy.sql.expression import _Function as Function
ImportError: cannot import name _Function

 - Expression: "fs.render()"
 - Filename:   ... .jquery-0.9.5-py2.7.egg/fa/jquery/templates/admin/new.pt
 - Location:   (line 6: col 36)
 - Source:     
^^^^^^^^^^^ - Expression: "field.render()" - Filename: ... ry-0.9.5-py2.7.egg/fa/jquery/templates/forms/fieldset.pt - Location: (line 21: col 32) - Source: tal:content="structure field.render()" /> ^^^^^^^^^^^^^^ - Arguments: repeat: {...} (0) renderer_name: pyramid_formalchemy:templates/forms/fieldset.pt localizer: F_: renderer_info: focus_rendered: True fieldset:
_: fatypes: request: req: field: html: context: view:
smurfix commented 10 years ago

Same here.

ERROR: 'RelationshipProperty' object has no attribute 'columns'
> /usr/lib/python2.7/dist-packages/formalchemy/fields.py(1859)_columns()
-> return prop.columns
(Pdb) w
  [...]
  /home/smurf/pybble/pybble/blueprint/_admin/__init__.py(78)object_edit()
-> fields = FieldSet(obj)
  /usr/lib/python2.7/dist-packages/formalchemy/forms.py(330)__init__()
-> L = [fields.AttributeField(attr, self) for attr in attrs]
  /usr/lib/python2.7/dist-packages/formalchemy/fields.py(1767)__init__()
-> _columns = self._columns
> /usr/lib/python2.7/dist-packages/formalchemy/fields.py(1859)_columns()
-> return prop.columns
(Pdb) u
> /usr/lib/python2.7/dist-packages/formalchemy/fields.py(1767)__init__()
-> _columns = self._columns
(Pdb) u
> /usr/lib/python2.7/dist-packages/formalchemy/forms.py(330)__init__()
-> L = [fields.AttributeField(attr, self) for attr in attrs]
(Pdb) p attrs
[<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7fb7f6063a90>, <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7fb7f606f5d0>, <sqlalchemy.orm.attributes.propertyProxy object at 0x7fb7f5af3810>, <sqlalchemy.orm.attributes.propertyProxy object at 0x7fb7f5afa3d0>]
(Pdb) d
> /usr/lib/python2.7/dist-packages/formalchemy/fields.py(1767)__init__()
-> _columns = self._columns
(Pdb) p self
<formalchemy.fields.AttributeField object at 0x7fb7f59d2b50>
(Pdb) d
> /usr/lib/python2.7/dist-packages/formalchemy/fields.py(1859)_columns()
-> return prop.columns
(Pdb) p prop
<RelationshipProperty at 0x7fb7f5d0aed0; parent>
(Pdb) p prop.__dict__
{'key': u'parent', 'synchronize_pairs': [(Column('id', Integer(), table=<obj>, primary_key=True, nullable=False), Column('parent_id', Integer(), ForeignKey(u'obj.id'), table=<obj>))], 'lazy': True, 'uselist': False, 'collection_class': None, 'back_populates': 'children', 'innerjoin': False, 'cascade_backrefs': True, 'mapper': <Mapper at 0x7fb7f67b3910; Object>, 'order_by': False, '_calculated_foreign_keys': set([Column('parent_id', Integer(), ForeignKey(u'obj.id'), table=<obj>)]), '_cascade': CascadeOptions('merge,save-update'), 'join_depth': None, 'strategy': <sqlalchemy.orm.strategies.LazyLoader object at 0x7fb7f5d26990>, '_lazy_strategy': <sqlalchemy.orm.strategies.LazyLoader object at 0x7fb7f5d26c90>, '_is_self_referential': True, 'enable_typechecks': True, 'passive_deletes': False, '_dependency_processor': ManyToOneDP(Object.parent), 'remote_side': set([Column('id', Integer(), table=<obj>, primary_key=True, nullable=False)]), 'single_parent': False, '_configure_finished': True, 'post_update': False, 'direction': symbol('MANYTOONE'), '_strategies': {<class 'sqlalchemy.orm.strategies.LazyLoader'>: <sqlalchemy.orm.strategies.LazyLoader object at 0x7fb7f5d26c90>, (('lazy', 'select'),): <sqlalchemy.orm.strategies.LazyLoader object at 0x7fb7f5d26c90>, (('lazy', True),): <sqlalchemy.orm.strategies.LazyLoader object at 0x7fb7f5d26990>}, 'parent': <Mapper at 0x7fb7f67b3910; Object>, 'load_on_pending': False, 'comparator_factory': <class 'sqlalchemy.orm.relationships.Comparator'>, 'argument': <Mapper at 0x7fb7f67b3910; Object>, 'local_columns': set([Column('parent_id', Integer(), ForeignKey(u'obj.id'), table=<obj>)]), '_configure_started': True, 'active_history': False, '_creation_order': 376, '_join_condition': <sqlalchemy.orm.relationships.JoinCondition object at 0x7fb7f5d26650>, 'local_remote_pairs': [(Column('parent_id', Integer(), ForeignKey(u'obj.id'), table=<obj>), Column('id', Integer(), table=<obj>, primary_key=True, nullable=False))], 'secondary': None, '_reverse_property': set([<RelationshipProperty at 0x7fb7f67a5690; children>]), 'viewonly': False, 'comparator': <sqlalchemy.orm.relationships.Comparator object at 0x7fb7f5d0af10>, 'extension': None, 'secondaryjoin': None, 'doc': None, 'passive_updates': True, 'query_class': None, 'strategy_class': <class 'sqlalchemy.orm.strategies.LazyLoader'>, 'primaryjoin': <sqlalchemy.sql.elements.BinaryExpression object at 0x7fb7f5d26850>, 'target': Table('obj', MetaData(bind=None), Column('id', Integer(), table=<obj>, primary_key=True, nullable=False), Column('owner_id', Integer(), ForeignKey(u'obj.id'), table=<obj>), Column('parent_id', Integer(), ForeignKey(u'obj.id'), table=<obj>), Column('superparent_id', Integer(), ForeignKey(u'obj.id'), table=<obj>), Column('discriminator', Integer(), ForeignKey(u'discriminator.id'), table=<obj>, nullable=False), schema=None), '_user_defined_foreign_keys': set([Column('parent_id', Integer(), ForeignKey(u'obj.id'), table=<obj>)]), 'backref': None, 'secondary_synchronize_pairs': [], 'distinct_target_key': None}
(Pdb) 

"parent" is a rather boring relationship on the same table:

    id = Column(Integer, primary_key=True, label="ID", renderer=IDrenderer)
    parent_id = Column(Integer,ForeignKey(id), index=True)      # direct ancestor (replied-to comment)
    children = relationship("Object", backref=backref('parent', remote_side=[id]), foreign_keys=(parent_id,), order_by="Object.id")
smurfix commented 10 years ago

I can't reproduce that with current sqlalchemy:

$ python
Python 2.7.6 (default, Mar 22 2014, 15:40:47)  [GCC 4.8.2] on linux2
>>> from sqlalchemy.sql.expression import Function
>>> 
benbeanfield commented 10 years ago

@smurfix Are you sure that you're using the latest version of SQLAlchemy?

$ pip freeze|grep -i SQLA
SQLAlchemy==0.9.4

$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from sqlalchemy.sql.expression import Function
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name Function

>>> from sqlalchemy.sql.expression import _Function
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name _Function
>>> 
smurfix commented 10 years ago

Hi,

benbeanfield:

@smurfix Are you sure that you're using the latest version of SQLAlchemy?

I am using the latest version from git, where this bug appears to be fixed.

smurf@desk:~$ python Python 2.7.6 (default, Mar 22 2014, 15:40:47) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information.

from sqlalchemy.sql.expression import Function import sqlalchemy sqlalchemy.version '0.9.5'

You might want to petition the sqlalchemy maintainer to cut a new release.

-- Matthias Urlichs

smurfix commented 10 years ago

sqlalchemy has released, so closing this.