cli.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import click
  2. from flask.cli import with_appcontext
  3. from flask_migrate import init as _init
  4. from flask_migrate import revision as _revision
  5. from flask_migrate import migrate as _migrate
  6. from flask_migrate import edit as _edit
  7. from flask_migrate import merge as _merge
  8. from flask_migrate import upgrade as _upgrade
  9. from flask_migrate import downgrade as _downgrade
  10. from flask_migrate import show as _show
  11. from flask_migrate import history as _history
  12. from flask_migrate import heads as _heads
  13. from flask_migrate import branches as _branches
  14. from flask_migrate import current as _current
  15. from flask_migrate import stamp as _stamp
  16. @click.group()
  17. def db():
  18. """Perform database migrations."""
  19. pass
  20. @db.command()
  21. @click.option('-d', '--directory', default=None,
  22. help=('migration script directory (default is "migrations")'))
  23. @click.option('--multidb', is_flag=True,
  24. help=('Support multiple databases'))
  25. @with_appcontext
  26. def init(directory, multidb):
  27. """Creates a new migration repository."""
  28. _init(directory, multidb)
  29. @db.command()
  30. @click.option('-d', '--directory', default=None,
  31. help=('migration script directory (default is "migrations")'))
  32. @click.option('-m', '--message', default=None, help='Revision message')
  33. @click.option('--autogenerate', is_flag=True,
  34. help=('Populate revision script with andidate migration '
  35. 'operatons, based on comparison of database to model'))
  36. @click.option('--sql', is_flag=True,
  37. help=('Don\'t emit SQL to database - dump to standard output '
  38. 'instead'))
  39. @click.option('--head', default='head',
  40. help=('Specify head revision or <branchname>@head to base new '
  41. 'revision on'))
  42. @click.option('--splice', is_flag=True,
  43. help=('Allow a non-head revision as the "head" to splice onto'))
  44. @click.option('--branch-label', default=None,
  45. help=('Specify a branch label to apply to the new revision'))
  46. @click.option('--version-path', default=None,
  47. help=('Specify specific path from config for version file'))
  48. @click.option('--rev-id', default=None,
  49. help=('Specify a hardcoded revision id instead of generating '
  50. 'one'))
  51. @with_appcontext
  52. def revision(directory, message, autogenerate, sql, head, splice, branch_label,
  53. version_path, rev_id):
  54. """Create a new revision file."""
  55. _revision(directory, message, autogenerate, sql, head, splice,
  56. branch_label, version_path, rev_id)
  57. @db.command()
  58. @click.option('-d', '--directory', default=None,
  59. help=('migration script directory (default is "migrations")'))
  60. @click.option('-m', '--message', default=None, help='Revision message')
  61. @click.option('--sql', is_flag=True,
  62. help=('Don\'t emit SQL to database - dump to standard output '
  63. 'instead'))
  64. @click.option('--head', default='head',
  65. help=('Specify head revision or <branchname>@head to base new '
  66. 'revision on'))
  67. @click.option('--splice', is_flag=True,
  68. help=('Allow a non-head revision as the "head" to splice onto'))
  69. @click.option('--branch-label', default=None,
  70. help=('Specify a branch label to apply to the new revision'))
  71. @click.option('--version-path', default=None,
  72. help=('Specify specific path from config for version file'))
  73. @click.option('--rev-id', default=None,
  74. help=('Specify a hardcoded revision id instead of generating '
  75. 'one'))
  76. @with_appcontext
  77. def migrate(directory, message, sql, head, splice, branch_label, version_path,
  78. rev_id):
  79. """Autogenerate a new revision file (Alias for 'revision --autogenerate')"""
  80. _migrate(directory, message, sql, head, splice, branch_label, version_path,
  81. rev_id)
  82. @db.command()
  83. @click.option('-d', '--directory', default=None,
  84. help=('migration script directory (default is "migrations")'))
  85. @click.argument('revision', default='head')
  86. @with_appcontext
  87. def edit(directory, revision):
  88. """Edit a revision file"""
  89. _edit(directory, revision)
  90. @db.command()
  91. @click.option('-d', '--directory', default=None,
  92. help=('migration script directory (default is "migrations")'))
  93. @click.option('-m', '--message', default=None, help='Merge revision message')
  94. @click.option('--branch-label', default=None,
  95. help=('Specify a branch label to apply to the new revision'))
  96. @click.option('--rev-id', default=None,
  97. help=('Specify a hardcoded revision id instead of generating '
  98. 'one'))
  99. @click.argument('revisions', nargs=-1)
  100. @with_appcontext
  101. def merge(directory, message, branch_label, rev_id, revisions):
  102. """Merge two revisions together, creating a new revision file"""
  103. _merge(directory, revisions, message, branch_label, rev_id)
  104. @db.command()
  105. @click.option('-d', '--directory', default=None,
  106. help=('migration script directory (default is "migrations")'))
  107. @click.option('--sql', is_flag=True,
  108. help=('Don\'t emit SQL to database - dump to standard output '
  109. 'instead'))
  110. @click.option('--tag', default=None,
  111. help=('Arbitrary "tag" name - can be used by custom "env.py '
  112. 'scripts'))
  113. @click.option('-x', '--x-arg', multiple=True,
  114. help='Additional arguments consumed by custom env.py scripts')
  115. @click.argument('revision', default='head')
  116. @with_appcontext
  117. def upgrade(directory, sql, tag, x_arg, revision):
  118. """Upgrade to a later version"""
  119. _upgrade(directory, revision, sql, tag, x_arg)
  120. @db.command()
  121. @click.option('-d', '--directory', default=None,
  122. help=('migration script directory (default is "migrations")'))
  123. @click.option('--sql', is_flag=True,
  124. help=('Don\'t emit SQL to database - dump to standard output '
  125. 'instead'))
  126. @click.option('--tag', default=None,
  127. help=('Arbitrary "tag" name - can be used by custom "env.py '
  128. 'scripts'))
  129. @click.option('-x', '--x-arg', multiple=True,
  130. help='Additional arguments consumed by custom env.py scripts')
  131. @click.argument('revision', default='-1')
  132. @with_appcontext
  133. def downgrade(directory, sql, tag, x_arg, revision):
  134. """Revert to a previous version"""
  135. _downgrade(directory, revision, sql, tag, x_arg)
  136. @db.command()
  137. @click.option('-d', '--directory', default=None,
  138. help=('migration script directory (default is "migrations")'))
  139. @click.argument('revision', default='head')
  140. @with_appcontext
  141. def show(directory, revision):
  142. """Show the revision denoted by the given symbol."""
  143. _show(directory, revision)
  144. @db.command()
  145. @click.option('-d', '--directory', default=None,
  146. help=('migration script directory (default is "migrations")'))
  147. @click.option('-r', '--rev-range', default=None,
  148. help='Specify a revision range; format is [start]:[end]')
  149. @click.option('-v', '--verbose', is_flag=True, help='Use more verbose output')
  150. @with_appcontext
  151. def history(directory, rev_range, verbose):
  152. """List changeset scripts in chronological order."""
  153. _history(directory, rev_range, verbose)
  154. @db.command()
  155. @click.option('-d', '--directory', default=None,
  156. help=('migration script directory (default is "migrations")'))
  157. @click.option('-v', '--verbose', is_flag=True, help='Use more verbose output')
  158. @click.option('--resolve-dependencies', is_flag=True,
  159. help='Treat dependency versions as down revisions')
  160. @with_appcontext
  161. def heads(directory, verbose, resolve_dependencies):
  162. """Show current available heads in the script directory"""
  163. _heads(directory, verbose, resolve_dependencies)
  164. @db.command()
  165. @click.option('-d', '--directory', default=None,
  166. help=('migration script directory (default is "migrations")'))
  167. @click.option('-v', '--verbose', is_flag=True, help='Use more verbose output')
  168. @with_appcontext
  169. def branches(directory, verbose):
  170. """Show current branch points"""
  171. _branches(directory, verbose)
  172. @db.command()
  173. @click.option('-d', '--directory', default=None,
  174. help=('migration script directory (default is "migrations")'))
  175. @click.option('-v', '--verbose', is_flag=True, help='Use more verbose output')
  176. @click.option('--head-only', is_flag=True,
  177. help='Deprecated. Use --verbose for additional output')
  178. @with_appcontext
  179. def current(directory, verbose, head_only):
  180. """Display the current revision for each database."""
  181. _current(directory, verbose, head_only)
  182. @db.command()
  183. @click.option('-d', '--directory', default=None,
  184. help=('migration script directory (default is "migrations")'))
  185. @click.option('--sql', is_flag=True,
  186. help=('Don\'t emit SQL to database - dump to standard output '
  187. 'instead'))
  188. @click.option('--tag', default=None,
  189. help=('Arbitrary "tag" name - can be used by custom "env.py '
  190. 'scripts'))
  191. @click.argument('revision', default='head')
  192. @with_appcontext
  193. def stamp(directory, sql, tag, revision):
  194. """'stamp' the revision table with the given revision; don't run any
  195. migrations"""
  196. _stamp(directory, revision, sql, tag)