Flask-SQLAlchemy 使用 SQLite 数据库,即使它是为 PostgreSQL 配置的
Flask-SQLAlchemy uses SQLite database even though it's configured for PostgreSQL
我在 Heroku 上有一个带有 PostgreSQL 数据库的 Flask 应用程序。我正在尝试 运行 我创建的迁移以使用 heroku 运行 命令迁移我们的登台数据库。但是,我收到 SQLite 方言无法呈现 JSON 类型的错误。我没有使用 SQLite。为什么会出现此错误?
heroku run python manage.py db upgrade --app flask-practice-stage
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 77, in _compiler_dispatch
meth = getter(visitor)
AttributeError: 'SQLiteTypeCompiler' object has no attribute 'visit_JSON'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 2159, in visit_create_table
and not first_pk)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 213, in process
return obj._compiler_dispatch(self, **kwargs)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch
return meth(self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 2190, in visit_create_column
first_pk=first_pk
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/dialects/sqlite/base.py", line 853, in get_column_specification
column.type, type_expression=column)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 261, in process
return type_._compiler_dispatch(self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 79, in _compiler_dispatch
raise exc.UnsupportedCompilationError(visitor, cls)
sqlalchemy.exc.UnsupportedCompilationError: Compiler <sqlalchemy.dialects.sqlite.base.SQLiteTypeCompiler object at 0x7f90926e7f60> can't render element of type <class 'sqlalchemy.dialects.postgresql.json.JSON'>
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 15, in <module>
manager.run()
File "/app/.heroku/python/lib/python3.5/site-packages/flask_script/__init__.py", line 412, in run
result = self.handle(sys.argv[0], sys.argv[1:])
File "/app/.heroku/python/lib/python3.5/site-packages/flask_script/__init__.py", line 383, in handle
res = handle(*args, **config)
File "/app/.heroku/python/lib/python3.5/site-packages/flask_script/commands.py", line 216, in __call__
return self.run(*args, **kwargs)
File "/app/.heroku/python/lib/python3.5/site-packages/flask_migrate/__init__.py", line 235, in upgrade
command.upgrade(config, revision, sql=sql, tag=tag)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/command.py", line 174, in upgrade
script.run_env()
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/script/base.py", line 397, in run_env
util.load_python_file(self.dir, 'env.py')
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/util/pyfiles.py", line 93, in load_python_file
module = load_module_py(module_id, path)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/util/compat.py", line 68, in load_module_py
module_id, path).load_module(module_id)
File "<frozen importlib._bootstrap_external>", line 385, in _check_name_wrapper
File "<frozen importlib._bootstrap_external>", line 806, in load_module
File "<frozen importlib._bootstrap_external>", line 665, in load_module
File "<frozen importlib._bootstrap>", line 268, in _load_module_shim
File "<frozen importlib._bootstrap>", line 693, in _load
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 662, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "migrations/env.py", line 87, in <module>
run_migrations_online()
File "migrations/env.py", line 80, in run_migrations_online
context.run_migrations()
File "<string>", line 8, in run_migrations
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/runtime/environment.py", line 797, in run_migrations
self.get_context().run_migrations(**kw)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/runtime/migration.py", line 312, in run_migrations
step.migration_fn(**kw)
File "/app/migrations/versions/260ae477b96f_.py", line 24, in upgrade
sa.PrimaryKeyConstraint('id')
File "<string>", line 8, in create_table
File "<string>", line 3, in create_table
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/operations/ops.py", line 1098, in create_table
return operations.invoke(op)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/operations/base.py", line 318, in invoke
return fn(self, operation)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/operations/toimpl.py", line 101, in create_table
operations.impl.create_table(table)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/ddl/impl.py", line 194, in create_table
self._exec(schema.CreateTable(table))
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/ddl/impl.py", line 118, in _exec
return conn.execute(construct, *multiparams, **params)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 914, in execute
return meth(self, multiparams, params)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/ddl.py", line 68, in _execute_on_connection
return connection._execute_ddl(self, multiparams, params)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 962, in _execute_ddl
compiled = ddl.compile(dialect=dialect)
File "<string>", line 1, in <lambda>
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/elements.py", line 494, in compile
return self._compiler(dialect, bind=bind, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/ddl.py", line 26, in _compiler
return dialect.ddl_compiler(dialect, self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 190, in __init__
self.string = self.process(self.statement, **compile_kwargs)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 213, in process
return obj._compiler_dispatch(self, **kwargs)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch
return meth(self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 2170, in visit_create_table
(table.description, column.name, ce.args[0])
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 200, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 183, in reraise
raise value.with_traceback(tb)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 2159, in visit_create_table
and not first_pk)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 213, in process
return obj._compiler_dispatch(self, **kwargs)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch
return meth(self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 2190, in visit_create_column
first_pk=first_pk
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/dialects/sqlite/base.py", line 853, in get_column_specification
column.type, type_expression=column)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 261, in process
return type_._compiler_dispatch(self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 79, in _compiler_dispatch
raise exc.UnsupportedCompilationError(visitor, cls)
sqlalchemy.exc.CompileError: (in table 'results', column 'result_all'): Compiler <sqlalchemy.dialects.sqlite.base.SQLiteTypeCompiler object at 0x7f90926e7f60> can't render element of type <class 'sqlalchemy.dialects.postgresql.json.JSON'>
{'APPLICATION_ROOT': None,
'CSRF_ENABLED': True,
'DEBUG': True,
'DEVELOPMENT': True,
'JSONIFY_PRETTYPRINT_REGULAR': True,
'JSON_AS_ASCII': True,
'JSON_SORT_KEYS': True,
'LOGGER_NAME': 'app',
'MAX_CONTENT_LENGTH': None,
'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31),
'PREFERRED_URL_SCHEME': 'http',
'PRESERVE_CONTEXT_ON_EXCEPTION': None,
'PROPAGATE_EXCEPTIONS': None,
'SECRET_KEY': 'this-needs-to-be-changed',
'SEND_FILE_MAX_AGE_DEFAULT': 43200,
'SERVER_NAME': None,
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_SECURE': False,
'SQLALCHEMY_DATABASE_URL': 'postgresql://localhost/flask_learning',
'TESTING': False,
'TRAP_BAD_REQUEST_ERRORS': False,
'TRAP_HTTP_EXCEPTIONS': False,
'USE_X_SENDFILE': False}
你打错了。配置键是 SQLALCHEMY_DATABASE_URI
,但你有 URL
。如果未配置,Flask-SQLAlchemy 默认为内存中的 SQLite 数据库。 SQLite 不知道 JSON
列类型是什么,这是 PostgreSQL 特有的。
我在 Heroku 上有一个带有 PostgreSQL 数据库的 Flask 应用程序。我正在尝试 运行 我创建的迁移以使用 heroku 运行 命令迁移我们的登台数据库。但是,我收到 SQLite 方言无法呈现 JSON 类型的错误。我没有使用 SQLite。为什么会出现此错误?
heroku run python manage.py db upgrade --app flask-practice-stage
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 77, in _compiler_dispatch
meth = getter(visitor)
AttributeError: 'SQLiteTypeCompiler' object has no attribute 'visit_JSON'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 2159, in visit_create_table
and not first_pk)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 213, in process
return obj._compiler_dispatch(self, **kwargs)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch
return meth(self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 2190, in visit_create_column
first_pk=first_pk
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/dialects/sqlite/base.py", line 853, in get_column_specification
column.type, type_expression=column)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 261, in process
return type_._compiler_dispatch(self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 79, in _compiler_dispatch
raise exc.UnsupportedCompilationError(visitor, cls)
sqlalchemy.exc.UnsupportedCompilationError: Compiler <sqlalchemy.dialects.sqlite.base.SQLiteTypeCompiler object at 0x7f90926e7f60> can't render element of type <class 'sqlalchemy.dialects.postgresql.json.JSON'>
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 15, in <module>
manager.run()
File "/app/.heroku/python/lib/python3.5/site-packages/flask_script/__init__.py", line 412, in run
result = self.handle(sys.argv[0], sys.argv[1:])
File "/app/.heroku/python/lib/python3.5/site-packages/flask_script/__init__.py", line 383, in handle
res = handle(*args, **config)
File "/app/.heroku/python/lib/python3.5/site-packages/flask_script/commands.py", line 216, in __call__
return self.run(*args, **kwargs)
File "/app/.heroku/python/lib/python3.5/site-packages/flask_migrate/__init__.py", line 235, in upgrade
command.upgrade(config, revision, sql=sql, tag=tag)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/command.py", line 174, in upgrade
script.run_env()
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/script/base.py", line 397, in run_env
util.load_python_file(self.dir, 'env.py')
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/util/pyfiles.py", line 93, in load_python_file
module = load_module_py(module_id, path)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/util/compat.py", line 68, in load_module_py
module_id, path).load_module(module_id)
File "<frozen importlib._bootstrap_external>", line 385, in _check_name_wrapper
File "<frozen importlib._bootstrap_external>", line 806, in load_module
File "<frozen importlib._bootstrap_external>", line 665, in load_module
File "<frozen importlib._bootstrap>", line 268, in _load_module_shim
File "<frozen importlib._bootstrap>", line 693, in _load
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 662, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "migrations/env.py", line 87, in <module>
run_migrations_online()
File "migrations/env.py", line 80, in run_migrations_online
context.run_migrations()
File "<string>", line 8, in run_migrations
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/runtime/environment.py", line 797, in run_migrations
self.get_context().run_migrations(**kw)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/runtime/migration.py", line 312, in run_migrations
step.migration_fn(**kw)
File "/app/migrations/versions/260ae477b96f_.py", line 24, in upgrade
sa.PrimaryKeyConstraint('id')
File "<string>", line 8, in create_table
File "<string>", line 3, in create_table
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/operations/ops.py", line 1098, in create_table
return operations.invoke(op)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/operations/base.py", line 318, in invoke
return fn(self, operation)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/operations/toimpl.py", line 101, in create_table
operations.impl.create_table(table)
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/ddl/impl.py", line 194, in create_table
self._exec(schema.CreateTable(table))
File "/app/.heroku/python/lib/python3.5/site-packages/alembic/ddl/impl.py", line 118, in _exec
return conn.execute(construct, *multiparams, **params)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 914, in execute
return meth(self, multiparams, params)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/ddl.py", line 68, in _execute_on_connection
return connection._execute_ddl(self, multiparams, params)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 962, in _execute_ddl
compiled = ddl.compile(dialect=dialect)
File "<string>", line 1, in <lambda>
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/elements.py", line 494, in compile
return self._compiler(dialect, bind=bind, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/ddl.py", line 26, in _compiler
return dialect.ddl_compiler(dialect, self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 190, in __init__
self.string = self.process(self.statement, **compile_kwargs)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 213, in process
return obj._compiler_dispatch(self, **kwargs)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch
return meth(self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 2170, in visit_create_table
(table.description, column.name, ce.args[0])
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 200, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 183, in reraise
raise value.with_traceback(tb)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 2159, in visit_create_table
and not first_pk)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 213, in process
return obj._compiler_dispatch(self, **kwargs)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch
return meth(self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 2190, in visit_create_column
first_pk=first_pk
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/dialects/sqlite/base.py", line 853, in get_column_specification
column.type, type_expression=column)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py", line 261, in process
return type_._compiler_dispatch(self, **kw)
File "/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py", line 79, in _compiler_dispatch
raise exc.UnsupportedCompilationError(visitor, cls)
sqlalchemy.exc.CompileError: (in table 'results', column 'result_all'): Compiler <sqlalchemy.dialects.sqlite.base.SQLiteTypeCompiler object at 0x7f90926e7f60> can't render element of type <class 'sqlalchemy.dialects.postgresql.json.JSON'>
{'APPLICATION_ROOT': None,
'CSRF_ENABLED': True,
'DEBUG': True,
'DEVELOPMENT': True,
'JSONIFY_PRETTYPRINT_REGULAR': True,
'JSON_AS_ASCII': True,
'JSON_SORT_KEYS': True,
'LOGGER_NAME': 'app',
'MAX_CONTENT_LENGTH': None,
'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31),
'PREFERRED_URL_SCHEME': 'http',
'PRESERVE_CONTEXT_ON_EXCEPTION': None,
'PROPAGATE_EXCEPTIONS': None,
'SECRET_KEY': 'this-needs-to-be-changed',
'SEND_FILE_MAX_AGE_DEFAULT': 43200,
'SERVER_NAME': None,
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_SECURE': False,
'SQLALCHEMY_DATABASE_URL': 'postgresql://localhost/flask_learning',
'TESTING': False,
'TRAP_BAD_REQUEST_ERRORS': False,
'TRAP_HTTP_EXCEPTIONS': False,
'USE_X_SENDFILE': False}
你打错了。配置键是 SQLALCHEMY_DATABASE_URI
,但你有 URL
。如果未配置,Flask-SQLAlchemy 默认为内存中的 SQLite 数据库。 SQLite 不知道 JSON
列类型是什么,这是 PostgreSQL 特有的。