环境:flask+python+sqlite,我想给某个表里某个字段加unique属性

执行 python manage.py db migrate 没报错,执行 python manage.py db upgrade 的时候报错如下

Traceback (most recent call last):
File "manage.py", line , in <module>
manager.run()
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/flask_script/__init__.py", line , in run
result = self.handle(argv[], argv[:])
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/flask_script/__init__.py", line , in handle
res = handle(*args, **config)
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/flask_script/commands.py", line , in __call__
return self.run(*args, **kwargs)
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/flask_migrate/__init__.py", line , in wrapped
f(*args, **kwargs)
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/flask_migrate/__init__.py", line , in upgrade
command.upgrade(config, revision, sql=sql, tag=tag)
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/alembic/command.py", line , in upgrade
script.run_env()
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/alembic/script/base.py", line , in run_env
util.load_python_file(self.dir, "env.py")
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/alembic/util/pyfiles.py", line , in load_python_file
module = load_module_py(module_id, path)
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/alembic/util/compat.py", line , in load_module_py
spec.loader.exec_module(module)
File "<frozen importlib._bootstrap_external>", line , in exec_module
File "<frozen importlib._bootstrap>", line , in _call_with_frames_removed
File "migrations/env.py", line , in <module>
run_migrations_online()
File "migrations/env.py", line , in run_migrations_online
context.run_migrations()
File "<string>", line , in run_migrations
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/alembic/runtime/environment.py", line , in run_migrations
self.get_context().run_migrations(**kw)
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/alembic/runtime/migration.py", line , in run_migrations
step.migration_fn(**kw)
File "/app/fusionwork_deployment/api/migrations/versions/ce7abee10440_.py", line , in upgrade
batch_op.create_unique_constraint(None, ['ip'])
File "/app/fusionwork_deployment/venv/lib/python3.6/contextlib.py", line , in __exit__
next(self.gen)
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/alembic/operations/base.py", line , in batch_alter_table
impl.flush()
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/alembic/operations/batch.py", line , in flush
fn(*arg, **kw)
File "/app/fusionwork_deployment/venv/lib/python3.6/site-packages/alembic/operations/batch.py", line , in add_constraint
raise ValueError("Constraint must have a name")
ValueError: Constraint must have a name

解决方案:

在app/__init__.py文件

增加代码

from sqlalchemy import MetaData

# 定义命名惯例
naming_convention = {
"ix": 'ix_%(column_0_label)s',
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(column_0_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s"
}
# db = SQLAlchemy()
db = SQLAlchemy(metadata=MetaData(naming_convention=naming_convention))

检查 migrations/env.py是否有 render_as_batch=True  配置

context.configure(
connection=connection,
target_metadata=target_metadata,
process_revision_directives=process_revision_directives,
compare_type=True, # 检查字段类型
compare_server_default=True, # 比较默认值
render_as_batch=True, # this is new feature,for sqlite alter table
**current_app.extensions['migrate'].configure_args
)

然后把之前迁移产生的版本文件删掉,重新迁移一次,成功。

flask-migrate 处理sqlite数据库报错Constraint must have a name 的解决方案的更多相关文章

  1. Django_重装系统后无法使用 sqlite 数据库报错:com.intellij.execution.ExecutionException: Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC

     重装系统后无法使用 sqlite 数据库报错 报错 : com.intellij.execution.ExecutionException: Exception in thread "ma ...

  2. [o] SQLite数据库报错: Invalid column C

    向SQLite数据库内新增列,之前出现过报错为提示no such column,通过删除并重建数据库文件解决,这次报错为无效的数据列: java.lang.IllegalArgumentExcepti ...

  3. [O] SQLite数据库报错:no such column

    在SQLite数据库创建语句增加列,运行后报错:no such column 在语法规范的前提下,即 //SQLite数据库创建,逗号与空格须严格 String CREATE_NOTE = " ...

  4. Django迁移数据库报错

    Django迁移数据库报错 table "xxx" already exists错误 django在migrate时报错django migrate error: table 'x ...

  5. dbstart和dbshut启动、关闭数据库报错ORACLE_HOME_LISTNER is not SET解决办法

    dbstart启动数据库报错,如下: [oracle@wen ~]$ dbstartORACLE_HOME_LISTNER is not SET, unable to auto-start Oracl ...

  6. sql server 2008 创建新数据库报错、创建表报错、更改表的设计报错

    一:创建数据库报错如下: 二:解决,将软件以管理员身份运行 三:创建表报错如下图: 四:解决办法,在你创建的数据库下面的安全里,找到你创建的用户,属性,添加权限,红色标注,然后确定: 五:更改表的设计 ...

  7. 连接mysql数据库报错java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized...解决方法

    今天连接mysql数据库报错如下: java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or r ...

  8. 远程登录oracle 12.2数据库报错ORA-28040解决办法

    今天新安装的oracle 12.2.0.1数据库,通过本地sqlplus远程登录12c数据库报错ora-28040,如下: ORA-28040: No matching authentication ...

  9. Mysql数据库报错1264

    数据库报错 [Err] 1264 - Out of range value adjusted for column 'ID' at row 1 修改MYSQL下的my.ini, 将 sql-mode= ...

随机推荐

  1. Python Ethical Hacking - WEB PENETRATION TESTING(1)

    WHAT IS A WEBSITE Computer with OS and some servers. Apache, MySQL ...etc. Cotains web application. ...

  2. oracle 启动报ORA-01105 ORA-19808

    bash-4.4$ srvctl start instance -i jfcddb2 -d jfcddb PRCR-1013 : Failed to start resource ora.jfcddb ...

  3. WYT的刷子

    WYT的刷子 题目描述 WYT有一把巨大的刷子,刷子的宽度为M米,现在WYT要使用这把大刷子去粉刷有N列的栅栏(每列宽度都为1米:每列的高度单位也为米,由输入数据给出). 使用刷子的规则是: 与地面垂 ...

  4. STL源码剖析:序

    STL源码包含哪些内容 容器:STL的核心 适配器:容器都是在一种最底层的基础容器上使用适配器实现 空间配置器:提供内存的管理 迭代器:由于遍历容器中的数据 算法:由于操作容器中的数据,如排序,拷贝, ...

  5. 自学 Python 到什么程度能找到工作,1300+ 条招聘信息告诉你答案

    随着移动互联网的发展以及机器学习等热门领域带给人们的冲击,让越来越多的人接触并开始学习 Python.无论你是是科班出身还是非科班转行,Python 无疑都是非常适合你入门计算机世界的第一门语言,其语 ...

  6. 题解 洛谷 P2046 【[NOI2010]海拔】

    首先进行贪心,发现海拔有梯度时一定是不优的,最优的情况是海拔像断崖一样上升,也就是左上角有一片海拔高度为\(0\),右下角有一片海拔高度为\(1\). 发现这样的性质后,不难想到用最小割来解决问题,但 ...

  7. vue学习(十一) v-for使用的注意事项:2.2.0+之后的版本里,当在组件中使用v-for时,key是必须的,它是用来表示唯一身份的

    //html <div id="app"> <div> <label>id <input type="text" v- ...

  8. paramiko上传文件到Linux

    一.传输单个文件到Linux服务器 import paramiko transport = paramiko.Transport(('host',22)) transport.connect(user ...

  9. 读/写xlsx文件

    安装 pip install openpyxl 1.创建Excel电子表格 建立新文档需要调用Workbook对象的save方法,一个Workbook对象代表一个Excel工作簿,该方法的参数是保存的 ...

  10. PHP array_map() 函数

    实例 将函数作用到数组中的每个值上,每个值都乘以本身,并返回带有新的值的数组: <?phpfunction myfunction($v){return($v*$v);} $a=array(1,2 ...