V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
smallgoogle
V2EX  ›  Python

SQLAlchemy 的方法封装有库嘛?

  •  2
     
  •   smallgoogle · 2019-02-18 02:04:32 +08:00 · 3350 次点击
    这是一个创建于 2110 天前的主题,其中的信息可能已经有所发展或是发生改变。

    每次在这问问题,我都有点问的不好意思了;但是还是要问;

    flask 框架,SQLAlchemy,用 mysql ;

    那么问题来了,是不是视图的每一个查询都要建立一个对应的 SQLAlchemy 模型来处理?

    比如,我要对 users 表进行添加、查询、更新;

    # models.py
    
    class users(db.Model):
        # 定义表名
        __tablename__ = 'users'
        # id 是主键 db.Column 是字段名,db.INT 是数据类型
        id = db.Column(db.INT, primary_key=True)
        username= db.Column(db.String(255), unique=False)
        password = db.Column(db.String(255), unique=False)
        ip = db.Column(db.String(255), unique=False)
        title = db.Column(db.String(255), unique=False)
        status = db.Column(db.String(255), default=1)
        update_time = db.Column(db.String(255), default=int(time.time()))
        create_time = db.Column(db.String(255), unique=False)
    
    

    我查询全部的时候是,得出的结果类型是 list

    from App.main.users import models
    
    data = models.users.query.all()
    

    我查询单条的时候是一个得出的类型是一个 class

    from App.main.users import models
    
    data = models.users.query.filter_by(id=1).first()
    

    话说那这个单条我怎么取结果呢?

    我就想各位大神发点 github 的 flask+mysql 的项目给我看看你们是怎么写的。

    8 条回复    2019-02-18 11:21:30 +08:00
    smallgoogle
        1
    smallgoogle  
    OP
       2019-02-18 02:28:50 +08:00
    原来还能在 model 里面写
    @classmethod
    def all(cls):
    return users.query.all()
    sunhk25
        2
    sunhk25  
       2019-02-18 07:41:40 +08:00 via Android
    可以为每个模型类定义一个 tojson 函数
    模型多的时候同问有什么优雅的实现方法吗?
    zvcs
        3
    zvcs  
       2019-02-18 08:18:36 +08:00 via Android
    @sunhk25 外部写一个 tojson,传入 obj 类型,读取每个 propty
    nuance2ex
        4
    nuance2ex  
       2019-02-18 08:29:11 +08:00 via iPhone
    @sunhk25 弄一个抽象基类。所有模型都继承自基类。

    class BaseModel(db.Model):
    __abstract__ = True
    def jsonify():
    pass

    楼主的问题,我想说 data 已经是数据了。data.id 已经可以读取属性了。如果是想打印结果的话,可以重写__repr__方法
    mxy940127
        5
    mxy940127  
       2019-02-18 09:13:47 +08:00
    class BaseModel(object):
    def __init__(self, **kwargs):
    self.add_attr(**kwargs)

    def add_attr(self, **kwargs):
    for key in kwargs.keys():
    setattr(self, key, kwargs[key])

    query = db_session.query_property()

    def convert_to_dict(self):
    d = self.__dict__
    d.pop('_sa_instance_state')
    return d
    Caratpine
        6
    Caratpine  
       2019-02-18 09:52:56 +08:00
    @sunhk25 #2

    Model 继承下面的类

    <script src="https://gist.github.com/Caratpine/47f4ecdb6073397b41576ba2ee44d76a.js"></script>
    Caratpine
        7
    Caratpine  
       2019-02-18 09:54:39 +08:00
    @sunhk25 #2

    class JSONSerializer(object):
    __json_public__ = None
    __json_hidden__ = None
    __json_default_modifiers__ = {}
    __json_custom_modifiers__ = {}

    def get_field_names(self):
    for p in self.__mapper__.iterate_properties:
    yield p.key

    @property
    def to_json(self):
    field_names = self.get_field_names()

    public = self.__json_public__ or field_names
    hidden = self.__json_hidden__ or []
    self.__json_default_modifiers__.update(self.__json_custom_modifiers__)
    modifiers = self.__json_default_modifiers__

    rs = dict()

    for key in public:
    rs[key] = getattr(self, key)

    for key, callback in modifiers.items():
    if hasattr(self, key):
    value = getattr(self, key)
    rs[key] = callback(value)

    for key in hidden:
    rs.pop(key, None)

    return rs
    l1xnan
        8
    l1xnan  
       2019-02-18 11:21:30 +08:00
    序列化的话,用 marshmallow,配套的有 marshmallow-sqlalchemy、flask-marshmallow,用着很方便……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:59 · PVG 03:59 · LAX 11:59 · JFK 14:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.