I receive a NameError for pgvector while attempting to create vector embeddings using pgvector with flask and flask-sqlalchemy.
NameError: name 'pgvector' is not defined
#extensions.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
#models.py
from extensions import db
from sqlalchemy.orm import mapped_column
from pgvector.sqlalchemy import Vector
N_DIM = 1536
class InstagramPosts(db.Model):
id = db.Column(db.Integer, primary_key=True)
embedding = mapped_column(Vector(N_DIM))
I then migrate to my postgres db via “flask db migrate -m “added embedding”
And attempt to run an upgrade via “flask db upgrade”
after which I get the name error.
[stacktrace]
Traceback (most recent call last):
File "/home/sopeade/Insearch/venv/bin/flask", line 8, in <module>
sys.exit(main())
^^^^^^
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/flask/cli.py", line 1105, in main
cli.main()
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/click/decorators.py", line 33, in new_func
return f(get_current_context(), *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/flask/cli.py", line 386, in decorator
return ctx.invoke(f, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/flask_migrate/cli.py", line 154, in upgrade
_upgrade(directory, revision, sql, tag, x_arg)
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/flask_migrate/__init__.py", line 111, in wrapped
f(*args, **kwargs)
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/flask_migrate/__init__.py", line 200, in upgrade
command.upgrade(config, revision, sql=sql, tag=tag)
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/alembic/command.py", line 403, in upgrade
script.run_env()
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/alembic/script/base.py", line 583, in run_env
util.load_python_file(self.dir, "env.py")
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 95, in load_python_file
module = load_module_py(module_id, path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/alembic/util/pyfiles.py", line 113, in load_module_py
spec.loader.exec_module(module) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen importlib._bootstrap_external>", line 995, in exec_module
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "/home/sopeade/Insearch/migrations/env.py", line 113, in <module>
run_migrations_online()
File "/home/sopeade/Insearch/migrations/env.py", line 107, in run_migrations_online
context.run_migrations()
File "<string>", line 8, in run_migrations
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/alembic/runtime/environment.py", line 948, in run_migrations
self.get_context().run_migrations(**kw)
File "/home/sopeade/Insearch/venv/lib/python3.12/site-packages/alembic/runtime/migration.py", line 627, in run_migrations
step.migration_fn(**kw)
File "/home/sopeade/Insearch/migrations/versions/2b0a38ba6267_added_pgvector_column.py", line 23, in upgrade
batch_op.add_column(sa.Column('embedding', pgvector.sqlalchemy.vector.VECTOR(dim=1536), nullable=True))
^^^^^^^^
NameError: name 'pgvector' is not defined
I have created the extension in the postgres database via
CREATE EXTENSION IF NOT EXISTS vector;
And I have installed pgvector via pip install pgvector and it is visible in my installed libraries via pip freeze
Not certain it is relevant but for what it is worth, my application is a flask application with blueprints and I am using the application factory method to create the app etc.