【问题标题】:can't render element of type <class 'sqlalchemy.dialects.postgresql.base.UUID'>无法呈现 <class 'sqlalchemy.dialects.postgresql.base.UUID'> 类型的元素
【发布时间】:2016-08-16 19:51:03
【问题描述】:

我在第 57 行看到了来自Flask-common 的这段代码:

id = db.Column(UUID, default=lambda: str(uuid.uuid4()), primary_key=True)

所以我想尝试一下并在我的应用程序的 models.py 中使用它(因为我更喜欢使用 uuid 类型作为我的 ID)

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.postgresql import UUID
import uuid

from app import db

class CostCenter(db.Model):
    __tablename__ = "costcenter"

    id = db.Column('id', UUID(as_uuid=True), default=lambda: str(uuid.uuid4()), primary_key=True)
    name = db.Column('name', db.Text)

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<id {}>'.format(self.id)

但是当我尝试运行python manage.py db upgrade 时,它会导致错误:

  File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/compiler.py", line 190, in __init__                                                          
  File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/compiler.py", line 213, in process                                                           
  File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch                                                 
  File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/compiler.py", line 2164, in visit_create_table                                               
  File "build/bdist.linux-x86_64/egg/sqlalchemy/util/compat.py", line 199, in raise_from_cause                                                   
  File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/compiler.py", line 2153, in visit_create_table                                               
  File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/compiler.py", line 213, in process                                                           
  File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch                                                 
  File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/compiler.py", line 2184, in visit_create_column                                              
  File "build/bdist.linux-x86_64/egg/sqlalchemy/dialects/sqlite/base.py", line 847, in get_column_specification                                  
  File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/compiler.py", line 261, in process                                                           
  File "build/bdist.linux-x86_64/egg/sqlalchemy/sql/visitors.py", line 79, in _compiler_dispatch                                                 
sqlalchemy.exc.CompileError: (in table 'costcenter', column 'id'): Compiler <sqlalchemy.dialects.sqlite.base.SQLiteTypeCompiler object at 0x7fc16
c1f1a50> can't render element of type <class 'sqlalchemy.dialects.postgresql.base.UUID'> 

为什么不能渲染类型 UUID?在SQLAlchemy 中可以识别,但在Flask-SQLAlchemy 中怎么不能?

【问题讨论】:

  • 您不能在 SQLite 中使用 Postgres 数据类型。它们是两个不同的数据库。
  • 对于任何来到这里并正在思考“但我没有将我的数据库设置为 sqlite!”的人。 -- 您可能没有正确地将您的 postgres 连接信息传递到 sqlalchemy,因此 默认 使用 sqlite 作为数据库。检查您的数据库配置信息。
  • 是否有替代方案,根据您使用的数据库类型,它运行一行或另一行?

标签: python postgresql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

您的列定义使用了仅适用于 postgresql 的函数,并且您的数据库类型为 sqlite。

你需要这个:

id = db.Column('id', db.Text(length=36), default=lambda: str(uuid.uuid4()), primary_key=True)

【讨论】:

  • 我现在才读到这篇文章,但碰巧我也求助于Text 专栏。不过谢谢你。
  • 文本在 sqlite 中也不可用?我认为所有 SQLALchemy().types 都可以在任何类型的数据库中使用。
【解决方案2】:

您可以使用UUID 以防使用postgresql 数据库。

【讨论】:

    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    相关资源
    最近更新 更多