使用SQLAlchemy中的自定义UUID类型

时间:2017-11-13 23:17:05

标签: python postgresql flask sqlalchemy guid

我目前正在使用存储在以下文件夹中的自定义UUID SQLAlchemy类型:/flask_application/helpers/uuid_creator.py,我在我的主模型中导入:

from flask_application.helpers import GUID

class User(db.Model):
    __tablename__ = 'user'

    id = db.Column(GUID(), primary_key=True)

我后来在其他两个表的外键列上使用了它:

护照表:

from flask_application.helpers import GUID

class Passport(db.Model):
    __tablename__ = 'passport'

...
user_id = db.Column(GUID(), db.ForeignKey('user.id'))
...

杂项表:

from flask_application.helpers import GUID


class Misc(db.Model):
    __tablename__ = 'misc'

...
user_id = db.Column(GUID(), db.ForeignKey('user.id'))

我保存后,运行python manage.py migrate命令只是为了找到这个:

Traceback (most recent call last):
  File "manage.py", line 4, in <module>
    from seed import createdata, dropdb, dropdata
  File "C:\www\liu-passport-api\seed.py", line 11, in <module>
    from flask_application import app, db
  File "C:\www\liu-passport-api\flask_application\__init__.py", line 44, in <module>
    from flask_application.models import (
  File "C:\www\liu-passport-api\flask_application\models\__init__.py", line 6, in <module>
    from .misc import *
  File "C:\www\liu-passport-api\flask_application\models\misc.py", line 5, in <module>
    from flask_application.helpers import GUID
  File "C:\www\liu-passport-api\flask_application\helpers\__init__.py", line 3, in <module>
    from .auth import (requires_auth, get_user_from_token)
  File "C:\www\liu-passport-api\flask_application\helpers\auth.py", line 11, in <module>
    from flask_application.models import User
ImportError: cannot import name 'User'

我认为导入不是问题,因为错误不是ImportError: No module named UUID,而是ImportError: cannot import name 'User'由于某种原因。

我是否从SQLAlchemy错误地实施此GUID扩展程序?当我为自定义数据类型添加GUID类时,用户ImportError开始发生,所以它不应该是错误。

1 个答案:

答案 0 :(得分:0)

您具有循环依赖项:seed导入flask_application(__init__.py),其中导入flask_application.models,后者导入flask_application.models.misc ...,其中导入flask_application.helpers.auth,最终导入flask_application.models!而您尚未完成加载iter的操作,就被卡住了。

似乎您在__init__.py文件中导入了很多东西,这被证明是非常差的做法(除非您非常小心)。此外,您还可以像from .misc import *这样导入星标。