Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sqlalchemy模型初始化将模型属性变形为非类型_Python_Sqlalchemy - Fatal编程技术网

Python sqlalchemy模型初始化将模型属性变形为非类型

Python sqlalchemy模型初始化将模型属性变形为非类型,python,sqlalchemy,Python,Sqlalchemy,我有一个用户模型,我正试图初始化,我不断得到 AttributeError:“非类型”对象没有属性“集” 经过进一步检查,我了解到sqlalchemy将其模型转换为映射器,映射器中包含InstrumentedAttribute属性,使其可查询。显然,这一切都发生在对象初始化时 这只发生在usermodel上,其他什么都没有 我尝试使用app_上下文来查看是否是由于db不在范围内。但这没用 class userData(db.Model): __tablename__ = "users"

我有一个用户模型,我正试图初始化,我不断得到

AttributeError:“非类型”对象没有属性“集”

经过进一步检查,我了解到sqlalchemy将其模型转换为映射器,映射器中包含InstrumentedAttribute属性,使其可查询。显然,这一切都发生在对象初始化时

这只发生在usermodel上,其他什么都没有

我尝试使用app_上下文来查看是否是由于db不在范围内。但这没用

class userData(db.Model):
    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(128), nullable=False)
    # TODO need to add hashing for the password
    password = db.Column(db.String(10), nullable=False)
    type = db.Column(db.String(5), nullable=False)

    facility_id = db.Column(db.Integer, db.ForeignKey('facility.id'), nullable=True)
    auth_hash = db.Column(db.String, nullable=True)

    def __init__(self, *args, **kwargs) -> None:
        super(userData, self).__init__(*args, **kwargs)

    def __getattr__(self, item):
        if item is 'facility':
            facility = facilityData.query.filter(facilityData.id == self.facility_id).first()
            if facility is None:
               return "No Facility Found"
            else:
                return facility.facility_name
作为参考,这一个工作得很好:

class barcodeData(db.Model):
    __tablename__ = 'barcodes'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    barcode = db.Column(db.String(128), nullable=False)
    medid = db.Column(db.String(128), nullable=False)

    user = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)

    def __init__(self, data):
        '''class constructor'''
        self.barcode = data.get('barcode')
        self.medid = data.get('medid')
        self.user = data.get('user')
这是我在尝试创建新的userData对象时遇到的错误

import models
import app
with app.app.app_context():
    models.userData(name='admin2', password='test2',  facility_id=1)
我甚至在没有app_context()的情况下尝试了另一种方法,然后专门从模型导入用户数据。还尝试在每次迭代中交替使用app_上下文

attributes.py in __set__(self, instance, value)
    258
    259     def __set__(self, instance, value):
--> 260         self.impl.set(
    261             instance_state(instance), instance_dict(instance),      value,        None
    262         )

    AttributeError: 'NoneType' object has no attribute 'set'

所以我才意识到为什么会发生这种行为。基本上,它与db范围或诸如此类的内容无关

问题在于,在类实例化期间,类的属性会变成可查询的属性,这意味着sqlalchemy需要引用所述属性。这是通过在创建对象之前使用
\uuuu getattr\uuuu
来推断类型(db.Column)来实现的

由于我重写了
\uuu getattr\uuuu
以使json的序列化更容易输出,因此它使用默认返回的值None。这就是导致错误的原因

@property
def facility(self)->str:
    # do stuff to get facility_name
    return facility_name

所以我才意识到为什么会发生这种行为。基本上,它与db范围或诸如此类的内容无关

问题在于,在类实例化期间,类的属性会变成可查询的属性,这意味着sqlalchemy需要引用所述属性。这是通过在创建对象之前使用
\uuuu getattr\uuuu
来推断类型(db.Column)来实现的

由于我重写了
\uuu getattr\uuuu
以使json的序列化更容易输出,因此它使用默认返回的值None。这就是导致错误的原因

@property
def facility(self)->str:
    # do stuff to get facility_name
    return facility_name

如果您不了解SQLAlchemy类的内部工作原理,那么尝试重写SQLAlchemy类的
\uuu getattr\uuuu
是一个坏主意,即使这样,这也不是最好的主意。它有很多。。。模型类的炼金术。我只是想说。是的,我做了一些挖掘,以了解当一个模型对象的类被实例化时,在引擎盖下会发生什么。IDK为什么我还在python3中使用属性装饰程序的
\uuuu getattr\uuuuuu
方法。如果您不了解SQLAlchemy类的内部工作原理,那么尝试重写SQLAlchemy类的
\uu getattr\uuuuuu
是个坏主意,即使这样也不是最好的主意。它有很多。。。模型类的炼金术。我只是想说。是的,我做了一些挖掘,以了解当一个模型对象的类被实例化时,在引擎盖下会发生什么。IDK为什么我还在python3中使用
\uuu getattr\uuu
方法,在python3中有属性装饰器。