edelooff / sqlalchemy-json

Full-featured JSON type with mutation tracking for SQLAlchemy
http://variable-scope.com/posts/mutation-tracking-in-nested-json-structures-using-sqlalchemy
BSD 2-Clause "Simplified" License
187 stars 34 forks source link

Library throws 'super' object has no attribute 'coerce' when column value is null() #55

Open eskuat opened 10 months ago

eskuat commented 10 months ago

Code to reproduce the exception

from sqlalchemy import Column
from sqlalchemy import create_engine, null, Integer
from sqlalchemy.dialects.sqlite import JSON
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_json import mutable_json_type

Base = declarative_base()
eng = create_engine("sqlite://")

class JTable(Base):
    __tablename__ = 'jtable'
    id = Column(Integer, primary_key=True)
    value = Column(mutable_json_type(JSON, nested=True))

def create_table():
    conn = eng.connect()
    conn.execute(
        """
        CREATE TABLE IF NOT EXISTS jtable  (
            id INTEGER PRIMARY KEY,
            value TEXT NULL
        );
        """
    )

if __name__ == "__main__":
    create_table()
    # throws - AttributeError: 'super' object has no attribute 'coerce'
    row = JTable(value=null())

This seem very similar to #10 and probably can be solved by adding similar checks. I can prepare a PR if necessary

edelooff commented 10 months ago

It sure looks like one of the paths is checked but the other one is left open. I'm curious if we really need two checks, or if the null() object compares equal to None, which would keep it a little more succinct.

Would happily accept a pr for this.

eskuat commented 8 months ago

Would happily accept a pr for this.

Could you please take a look at PR ?

BillSeitz commented 7 months ago

I get this same error in flask/SqlAlchemy when trying to set a non-null value on a column. (Talking to postgresql.) node.node_data = node_data

Or is there some other barely-related stupid mistake I'm making?

sqlalchemy-json_error 2023-11-26 at 3 34 57 PM
chamini2 commented 4 months ago

I am seeing this happen when the JSON passed is a string (which is valid json)