Alembic SQLAlchemy autogenerate MetaData error
我正在尝试使用运行
FAILED: Can't proceed with --autogenerate option; environment script /Users/paul/python/my_project/alembic/env.py does not provide a MetaData object or sequence of objects to the context.
我无法弄清楚为什么会出现此错误,因为我已经在env.py文件中设置了target_metadata,并将文件夹添加到了路径中。我尝试从另一个项目中复制Alembic设置,但没有任何问题,但是在该项目上我仍然遇到相同的错误。当我运行
我的alembic.ini文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | # A generic, single database configuration. [alembic] # path to migration scripts script_location = alembic # template used to generate migration files # file_template = %%(rev)s_%%(slug)s # timezone to use when rendering the date # within the migration file as well as the filename. # string value is passed to dateutil.tz.gettz() # leave blank for localtime # timezone = # max length of characters to apply to the #"slug" field # truncate_slug_length = 40 # set to 'true' to run the environment during # the 'revision' command, regardless of autogenerate # revision_environment = false # set to 'true' to allow .pyc and .pyo files without # a source .py file to be detected as revisions in the # versions/ directory # sourceless = false # version location specification; this defaults # to alembic/versions. When using multiple version # directories, initial revisions must be specified with --version-path # version_locations = %(here)s/bar %(here)s/bat alembic/versions # the output encoding used when revision files # are written from script.py.mako # output_encoding = utf-8 sqlalchemy.url = sqlite:///./src/db/data.sqlite # Logging configuration [loggers] keys = root,sqlalchemy,alembic [handlers] keys = console [formatters] keys = generic [logger_root] level = WARN handlers = console qualname = [logger_sqlalchemy] level = WARN handlers = qualname = sqlalchemy.engine [logger_alembic] level = INFO handlers = qualname = alembic [handler_console] class = StreamHandler args = (sys.stderr,) level = NOTSET formatter = generic [formatter_generic] format = %(levelname)-5.5s [%(name)s] %(message)s datefmt = %H:%M:%S |
我的env.py文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | import sys from logging.config import fileConfig from pathlib import Path from sqlalchemy import engine_from_config from sqlalchemy import pool from alembic import context folder = Path(__file__).resolve().parents[1] sys.path.insert(0, str(folder)) import src.data.__all_models from src.data.modelbase import SqlAlchemyBase # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config # Interpret the config file for Python logging. # This line sets up loggers basically. fileConfig(config.config_file_name) # add your model's MetaData object here # for 'autogenerate' support # from myapp import mymodel # target_metadata = mymodel.Base.metadata target_metadata = SqlAlchemyBase.metadata # other values from the config, defined by the needs of env.py, # can be acquired: # my_important_option = config.get_main_option("my_important_option") # ... etc. def run_migrations_offline(): """Run migrations in 'offline' mode. This configures the context with just a URL and not an Engine, though an Engine is acceptable here as well. By skipping the Engine creation we don't even need a DBAPI to be available. Calls to context.execute() here emit the given string to the script output. """ url = config.get_main_option("sqlalchemy.url") context.configure( url=url, target_metadata=target_metadata, literal_binds=True ) with context.begin_transaction(): context.run_migrations() def run_migrations_online(): """Run migrations in 'online' mode. In this scenario we need to create an Engine and associate a connection with the context. """ connectable = engine_from_config( config.get_section(config.config_ini_section), prefix="sqlalchemy.", poolclass=pool.NullPool, ) with connectable.connect() as connection: context.configure( connection=connection, target_metadata=target_metadata ) with context.begin_transaction(): context.run_migrations() if context.is_offline_mode(): run_migrations_offline() else: run_migrations_online() |
我的modelbase.py文件:
1 2 3 4 | import sqlalchemy.ext.declarative as dec SqlAlchemyBase = dec.declarative_base() |
该错误消息显示了env.py文件的正确路径,因此它似乎在查找文件但没有看到
问题出在我的编辑器上。我关闭了env.py文件,然后重新打开它,所有更改都在预期的位置。然后,我决定看看如果通过命令从控制台中的错误消息中单击文件(我正在使用VSCode)来打开文件(我正在使用VSCode)时发生了什么,而我以这种方式打开文件时没有任何更改。我尝试再次从侧面文件资源管理器中打开文件,但更改已在文件中,但Alembic仍然无法运行。我完全关闭了VSCode并重新打开它,然后所做的更改已保存在我的文件中,并且Alembic正常运行了。
我以前从未遇到过这个问题,所以我不知道VSCode发生了什么,但是无论重新启动它都可以解决问题。