webfrontier-intern-2022 / -

0 stars 0 forks source link

alembic でマイグレーションできない #6

Open KazuyukiSomeya opened 2 years ago

KazuyukiSomeya commented 2 years ago

alembic.iniが見つからない問題は再現できず。

ターミナルでalembic.iniがあるディレクトリに移動して実施しているか確認してください。 codeserver@73def84d079c:~/workspace/samples/master$ ls -l total 36 -rw-r--r-- 1 codeserver codeserver 422 9月 22 15:38 App.js -rw-r--r-- 1 codeserver codeserver 3219 9月 22 15:38 alembic.ini -rw-r--r-- 1 codeserver codeserver 890 9月 22 15:38 authenticate.py -rw-r--r-- 1 codeserver codeserver 964 9月 22 15:38 crud.py -rw-r--r-- 1 codeserver codeserver 432 9月 22 15:38 database.py drwxr-xr-x 3 codeserver codeserver 4096 9月 22 19:26 migration -rw-r--r-- 1 codeserver codeserver 2135 9月 22 15:38 models.py -rw-r--r-- 1 codeserver codeserver 451 9月 22 15:38 schemas.py -rw-r--r-- 1 codeserver codeserver 39 9月 22 15:38 t.txt

それでもダメなら下記の -c オプションで設定ファイルを指定できるので、指定して試して見てください。

codeserver@73def84d079c:~/workspace/samples/master$ alembic -h usage: alembic [-h] [--version] [-c CONFIG] [-n NAME] [-x X] [--raiseerr] {branches,current,downgrade,edit,ensure_version,heads,history,init,list_templates,merge,revision,show,stamp,upgrade} ...

positional arguments: {branches,current,downgrade,edit,ensure_version,heads,history,init,list_templates,merge,revision,show,stamp,upgrade} branches Show current branch points. current Display the current revision for a database. downgrade Revert to a previous version. edit Edit revision script(s) using $EDITOR. ensure_version Create the alembic version table if it doesn't exist already . heads Show current available heads in the script directory. history List changeset scripts in chronological order. init Initialize a new scripts directory. list_templates List available templates. merge Merge two revisions together. Creates a new migration file. revision Create a new revision file. show Show the revision(s) denoted by the given symbol. stamp 'stamp' the revision table with the given revision; don't run any migrations. upgrade Upgrade to a later version.

options: -h, --help show this help message and exit --version show program's version number and exit -c CONFIG, --config CONFIG Alternate config file; defaults to value of ALEMBIC_CONFIG environment variable, or "alembic.ini" -n NAME, --name NAME Name of section in .ini file to use for Alembic config -x X Additional arguments consumed by custom env.py scripts, e.g. -x setting1=somesetting -x setting2=somesetting --raiseerr Raise a full stack trace on error

KazuyukiSomeya commented 2 years ago

別の問題 https://qiita.com/penpenta/items/c993243c4ceee3840f30 のalembic init で生成されたはずのversionsディレクトリがgithubのリポジトリに作成されてないため、単純にgit cloneした状態で alembic revision -m {ファイル名} を実行すると失敗する。 gitはディレクトリをバージョン管理の対象にしないので、空のディレクトリはcommitされない。 空のディレクトリをgitで管理したい場合は、 .gitkeep gitkeep などダミーのファイルを作成して管理対象とする習慣がある。

KazuyukiSomeya commented 2 years ago

↑ ただ、今回は作成したモデルからマイグレーションファイルを作成するので、その手順でやれば手動で作る必要はない。

https://qiita.com/penpenta/items/c993243c4ceee3840f30#migration-%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%87%AA%E5%8B%95%E3%81%A7%E7%94%9F%E6%88%90%E3%81%95%E3%81%9B%E3%82%8B

SQLAlchemy のモデルの定義 ↓ env.py の編集 ↓ autogenerate を使用した migration の実行

上記に加えて、alembic.ini でデータベース接続文字列も実際のものに変更する必要がある。 sqlalchemy.url = driver://user:pass@localhost/dbname

itashize commented 2 years ago

エラーコードです codeserver@7d4ff92b16c6:/workspace/-/back$ alembic revision --autogenerate -m "create table" Traceback (most recent call last): File "/home/codeserver/.asdf/installs/python/3.10.6/bin/alembic", line 8, in sys.exit(main()) File "/home/codeserver/.asdf/installs/python/3.10.6/lib/python3.10/site-packages/alembic/config.py", line 590, in main CommandLine(prog=prog).main(argv=argv) File "/home/codeserver/.asdf/installs/python/3.10.6/lib/python3.10/site-packages/alembic/config.py", line 584, in main self.run_cmd(cfg, options) File "/home/codeserver/.asdf/installs/python/3.10.6/lib/python3.10/site-packages/alembic/config.py", line 561, in run_cmd fn( File "/home/codeserver/.asdf/installs/python/3.10.6/lib/python3.10/site-packages/alembic/command.py", line 229, in revision script_directory.run_env() File "/home/codeserver/.asdf/installs/python/3.10.6/lib/python3.10/site-packages/alembic/script/base.py", line 569, in run_env util.load_python_file(self.dir, "env.py") File "/home/codeserver/.asdf/installs/python/3.10.6/lib/python3.10/site-packages/alembic/util/pyfiles.py", line 94, in load_python_file module = load_module_py(module_id, path) File "/home/codeserver/.asdf/installs/python/3.10.6/lib/python3.10/site-packages/alembic/util/pyfiles.py", line 110, in load_module_py spec.loader.exec_module(module) # type: ignore File "", line 883, in exec_module File "", line 241, in _call_with_frames_removed File "/home/codeserver/workspace/-/back/migration/env.py", line 10, in from models.models_professor import models_professor File "/home/codeserver/workspace/-/back/./models/models_professor.py", line 9, in class Professor(ModelBase): File "/home/codeserver/workspace/-/back/./models/models_professor.py", line 13, in Professor id = Column(Integer, Index=True, Primary_key=True) File "/home/codeserver/.asdf/installs/python/3.10.6/lib/python3.10/site-packages/sqlalchemy/sql/schema.py", line 1772, in init self._extra_kwargs(**kwargs) File "/home/codeserver/.asdf/installs/python/3.10.6/lib/python3.10/site-packages/sqlalchemy/sql/schema.py", line 1814, in _extra_kwargs self._validate_dialect_kwargs(kwargs) File "/home/codeserver/.asdf/installs/python/3.10.6/lib/python3.10/site-packages/sqlalchemy/sql/base.py", line 424, in _validate_dialectkwargs raise TypeError( TypeError: Additional arguments should be named , got 'Index'

itashize commented 2 years ago

エラーが起きるようになった原因 env.pyにデータベースモデルに対してマイグレーションを作成するよう追記

追記したコード from models.models_professor import models_professor from models.models_students import models_students from models.models_lecture import models_lecture from models.models_course import models_course

target_metadata = [Professor.metadata, Student.metadata, Lecture.metadata, Course.metadata]

KazuyukiSomeya commented 2 years ago

引数がtypoしていると思う。("Index"とか"Primary_key"とかが大文字になっている) https://github.com/webfrontier-intern-2022/-/blob/5a257895dfb7a2b77fd925302479315e4cb78299/back/models/models_professor.py#L13

id = Column('id', Integer, primary_key=True, autoincrement=True) ★プライマリーキーはそもそもindex張られるはずなので、indexは不要 email = Column('email', String(255), index=True, unique=True)

とか。他のモデルも同様。

KazuyukiSomeya commented 2 years ago

というか、その前にColumn名の指定がないからか。 https://docs.sqlalchemy.org/en/14/core/metadata.html#sqlalchemy.schema.Column.params.name