我曾经遇到过同样的问题。首先,我可以建议更新
Flask
,
Flask-SQLAlchemy
以及相关套餐。
Flask==1.1.2
,
Flask-SQLAlchemy==2.4.0
,
SQLAlchemy==1.3.18
,
SQLAlchemy-Utils==0.36.6
工作良好:
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://postgres:postgres@localhost:5432/test'
db = SQLAlchemy(app)
class Myclass(db.Model):
id = db.Column(db.Integer, primary_key=True)
custom_type = db.Column(
'custom_type',
CompositeArray(
CompositeType(
'custom_type',
[
db.Column('id', db.Text),
db.Column('name', db.Text),
]
)
)
)
db.create_all()
db.engine.execute("""
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'custom_type') THEN
CREATE TYPE custom_type AS (
id text,
name text
);
END IF;
END$$;
""")
@app.route('/')
def test():
db.session.add(Myclass(custom_type=[
{'id': 'test_1', 'name': 'first'},
{'id': 'test_2', 'name': 'second'},
]))
db.session.commit()
return 'done'
但是
几年前
我用
sqlalchemy_utils.register_composites()
。大致是这样的:
def create_app():
app = Flask(__name__)
# blablabla
engine = db.get_engine()
engine.dispose()
register_composites(engine.connect())
return app
你也可以试试
psycopg2.extras.register_composite
.