Flask-SQLAlchemy即使为PostgreSQL配置也使用SQLite数据库 [英] Flask-SQLAlchemy uses SQLite database even though it's configured for PostgreSQL

查看:440
本文介绍了Flask-SQLAlchemy即使为PostgreSQL配置也使用SQLite数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Heroku上有一个PostgreSQL数据库的Flask应用程序。我试图通过使用heroku运行命令来运行我创建的迁移来迁移我们的暂存数据库。但是,我收到SQLite方言无法呈现JSON类型的错误。我没有使用SQLite。为什么我得到这个错误?

heroku run python manage.py db upgrade --app flask实践阶段



Traceback (最近最后一次调用):
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py,第77行,在_compiler_dispatch中
= getter(visitor)
AttributeError:'SQLiteTypeCompiler'对象没有属性'visit_JSON'

在处理上述异常期间,发生另一个异常:

Traceback最近的调用最后):
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py,第2159行,在visit_create_table
而不是first_pk)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py,第213行,正在处理
return obj._compiler_dispatch(self ,** kwargs)
文件/app/.heroku/python/lib/python 3.5 / site-packages / sqlalchemy / sql / visitors.py,第81行,在_compiler_dispatch
return meth(self,** kw)
文件/app/.heroku/python/lib/python3 .5 / site-packages / sqlalchemy / sql / compiler.py,第2190行,在visit_create_column
first_pk = first_pk
文件/app/.heroku/python/lib/python3.5/site- packages / sqlalchemy / dialects / sqlite / base.py,第853行,在get_column_specification
column.type,type_expression = column)
文件/app/.heroku/python/lib/python3.5/ site-packages / sqlalchemy / sql / compiler.py,第261行,正在处理
返回类型_._ compiler_dispatch(self,** kw)
文件/app/.heroku/python/lib/python3在.compiler_dispatch
中提取.5 / site-packages / sqlalchemy / sql / visitors.py,第79行,加上exc.UnsupportedCompilationError(visitor,cls)
sqlalchemy.exc.UnsupportedCompilationError:Compiler< sqlalchemy.dialects .sqlite.base.SQLiteTypeCompiler对象在0x7f90926e7f60>无法呈现类型< class'的元素sqlalchemy.dialects.postgresql.json.JSON'>

上面的异常是以下异常的直接原因:

Traceback(最近一次调用的最后一个):
文件manage.py,第15行,在< module>
manager.run()
运行
结果文件/app/.heroku/python/lib/python3.5/site-packages/flask_script/__init__.py,行412 = self.handle(sys.argv [0],sys.argv [1:])
文件/app/.heroku/python/lib/python3.5/site-packages/flask_script/__init__.py ,第383行,在句柄
res = handle(* args,** config)
文件/app/.heroku/python/lib/python3.5/site-packages/flask_script/commands.py ,第216行,在__call__
中返回self.run(* args,** kwargs)
文件/app/.heroku/python/lib/python3.5/site-packages/flask_migrate/__init__ .py,第235行,升级
command.upgrade(config,revision,sql = sql,tag = tag)
文件/app/.heroku/python/lib/python3.5/site -packages / alembic / command.py,第174行,升级
script.run_env()
文件/app/.heroku/python/lib/python3.5/site-packages/alembic/脚本/ base.py,第397行,在run_env
util.load_python_file(self.dir,'env.py')
文件/app/.heroku/python/lib/python3.5/网站-PA ckages / alembic / util / pyfiles.py,第93行,在load_python_file中
module = load_module_py(module_id,path)
文件/app/.heroku/python/lib/python3.5/site- package_launcher / util / compat.py,第68行,在load_module_py
module_id,path).load_module(module_id)
文件< frozen importlib._bootstrap_external>,行385,在_check_name_wrapper
在load_module
文件< frozen importlib._bootstrap_external>行665,在load_module
文件< frozen importlib中, _bootstrap>第268行,在_load_module_shim
文件中< frozen importlib._bootstrap>行693,在_load
文件中< frozen importlib._bootstrap>,行673,在_load_unlocked
文件< frozen importlib._bootstrap_external>,第662行,在exec_module
文件< frozen importlib._bootstrap>,第222行,在_call_with_frames_removed
文件migrations / env.py ,第87行,在< module&g吨;
run_migrations_online()
在run_migrations_online
文件migrations / env.py,第80行
文件< string>,第8行run_migrations
在run_migrations
self.get_context()中的文件/app/.heroku/python/lib/python3.5/site-packages/alembic/runtime/environment.py,第797行。run_migrations (** kw)
在run_migrations中输入文件/app/.heroku/python/lib/python3.5/site-packages/alembic/runtime/migration.py,第312行
step.migration_fn (** kw)
文件/app/migrations/versions/260ae477b96f_.py,第24行,升级
sa.PrimaryKeyConstraint('id')
文件< string> ,第8行,在create_table
文件< string>,第3行,在create_table
文件/app/.heroku/python/lib/python3.5/site-packages/alembic/ operations / ops.py,第1098行,在create_table
返回operations.invoke(op)
文件/app/.heroku/python/lib/python3.5/site-packages/alembic/operations /base.py,行318,在我nvoke
return fn(self,operation)
在create_table中的第101行/app/.heroku/python/lib/python3.5/site-packages/alembic/operations/toimpl.py文件
operations.impl.create_table(table)
文件/app/.heroku/python/lib/python3.5/site-packages/alembic/ddl/impl.py,第194行,在create_table
self._exec(schema.CreateTable(table))
文件/app/.heroku/python/lib/python3.5/site-packages/alembic/ddl/impl.py,第118行,在_exec
中返回conn.execute(构造,* multiparams,** params)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/engine/base .py,第914行,执行
return meth(self,multiparams,params)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/ ddl.py,第68行,在_execute_on_connection
返回connection._execute_ddl(self,multiparams,params)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy /engine/base.py,行962,在_execute_ddl
comp iled = ddl.compile(dialect = dialect)
文件< string>,第1行,位于< lambda>
在编译
的文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/elements.py,第494行,返回self._compiler(dialect,bind = bind,** kw)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/ddl.py,第26行,在_compiler
返回dialect.ddl_compiler(dialect,self,** kw)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py,第190行,在__init__
self.string = self.process(self.statement,** compile_kwargs)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler。 py,第213行,正在处理
return obj._compiler_dispatch(self,** kwargs)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql /visitors.py,第81行,在_compiler_dispatch
return meth(self,** kw)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/ sql / compiler.py,第2170行,在visit_create_table
(table.description,column.name, ce.args [0])
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/util/compat.py,第200行,在raise_from_cause
reraise (type(exception),exception,tb = exc_tb,cause = cause)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/util/compat.py,行183,重新
增加value.with_traceback(tb)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py,第2159行,在visit_create_table
而不是first_pk)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py,第213行,正在处理
返回obj._compiler_dispatch(self,** kwargs)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/visitors.py,第81行,在_compiler_dispatch
return meth(self,** kw)
文件/app/.heroku/python/lib/python3.5/site-packages/sqlalchemy/sql/compiler.py,第2190行,在visit_create_column
first_pk = first_pk
文件/app/.heroku/pyt在/etc/init.d/boot.php文件/app/中输入/etc/home/lib/ python3.5 / site-packages / sqlalchemy / dialects / sqlite / base.py,第853行,在get_column_specification
column.type,type_expression = / bin / sqlalchemy / sql / compiler.py,第261行,正在处理
返回类型_._compiler_dispatch(self,** kw)
文件/oracle/python/lib/python3.5/site-packages/sqllalchemy/sql/compiler.py app / .heroku / python / lib / python3.5 / site-packages / sqlalchemy / sql / visitors.py,第79行,在_compiler_dispatch
引发exc.UnsupportedCompilationError(visitor,cls)
sqlalchemy。 exc.CompileError :(在表'results'中,列'result_all'):Compiler< sqlalchemy.dialects.sqlite.base.SQLiteTypeCompiler object at 0x7f90926e7f60>无法呈现类型< class'的元素sqlalchemy.dialects.postgresql.json.JSON'>





  {'APPLICATION_ROOT' :无,
'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':无,
'PROPAGATE_EXCEPTIONS':无,
'SECRET_KEY':'这个需要改变',
'SEND_FILE_MAX_AGE_DEFAULT':43200,
'SERVER_NAME':无,
'SESSION_COOKIE_DOMAIN':无,
'SESSION_COOKIE_HTTPONLY':是,
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_PATH':None,
'SESSION_COOKIE_SECURE':False,
'SQLALCHEMY_DATABASE_URL':'postgresql:// localhost / flask_learning',
'TE STING':False,
'TRAP_BAD_REQUEST_ERRORS':False,
'TRAP_HTTP_EXCEPTIONS':False,
'USE_X_SENDFILE':False}


解决方案

你有一个错字。配置键是 SQLALCHEMY_DATABASE_URI ,但是你有 URL 。如果没有配置,Flask-SQLAlchemy默认为内存中的SQLite数据库。 SQLite不知道什么 JSON 列类型,这是特定于PostgreSQL的。


I have a Flask app with a PostgreSQL database on Heroku. I am trying to run the migrations that I created to migrate our staging database by using the heroku run command. However, I get an error that the SQLite dialect can't render a JSON type. I'm not using SQLite. Why am I getting this error?

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}

解决方案

You have a typo. The config key is SQLALCHEMY_DATABASE_URI, but you have URL. Flask-SQLAlchemy defaults to an in-memory SQLite database if it is not configured. SQLite doesn't know what the JSON column type is, that's specific to PostgreSQL.

这篇关于Flask-SQLAlchemy即使为PostgreSQL配置也使用SQLite数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆