如何给sqlalchemy的自动映射类添加__repr__方法

工作中,使用sqlalchemy自动反射数据库表结构,可以直接获得映射类。表对应的字段都可以直接使用类对象的“.属性”格式获得。
下面是一个简单的例子:

from sqlalchemy import create_engine, inspect, MetaData
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
import pymysql
pymysql.install_as_MySQLdb()

url = 'mysql+mysqldb://root:123456@127.0.0.1/mylocal_db'
tables = ['sf_order']


class DBUser:

    def __init__(self):
        engine = create_engine(url)
        metadata = MetaData()
        metadata.reflect(bind=engine, only=tables)
        Base = automap_base(metadata=metadata)
        Base.prepare()
        self.sf = Base.classes.sf_order
        # self.sf.__repr__ = __repr__

        self.Session = sessionmaker(bind=engine)

    def get_one_order(self):
    	"""
    	取出表中的第一个数据
    	"""
        session = self.Session()
        order = session.query(self.sf).limit(1).first()
        session.close()
        return order

db = DBUser()

if __name__ == '__main__':
    order1 = db.get_one_order()
    print(order1)
    print(order1.sf_id)

运行结果

<sqlalchemy.ext.automap.sf_order object at 0x000001E502B6D7C8>
1

看见order.sf_id可以直接获得对应的sf_id字段的内容,但是直接print取出行数据的对象,只能获得内存地址。可见,sqlalchemy并没有给自动映射类添加__repr__方法。

我们可以手动添加一下。

class DBUser:

    def __init__(self):
        engine = create_engine(url)
        metadata = MetaData()
        metadata.reflect(bind=engine, only=tables)
        Base = automap_base(metadata=metadata)
        Base.prepare()

		# 做一个自定义的 __repr__
		# 注意配合 sqlalchemy 模块的 inspect方法,获取映射类的属性
        def __repr__(self_):
            ret = f'{type(self_).__name__}<'
            for key in inspect(type(self_)).c.keys():
                ret += f'{key}: {getattr(self_, key)},'
            ret.rstrip(',')
            ret += '>'
            return ret
        self.sf = Base.classes.sf_order
        # 如果将多张表映射了动态类,这边可以按相同格式处理
        self.sf.__repr__ = __repr__

        self.Session = sessionmaker(bind=engine)

    def get_one_order(self):
        session = self.Session()
        order = session.query(self.sf).limit(1).first()
        session.close()
        return order
db = DBUser()


if __name__ == '__main__':
    order1 = db.get_one_order()
    print(order1)
    print(order1.sf_id)

输出:

sf_order<sf_id: 1,bill_no: SF20230427002,from_address: 兴业大厦887,>
1
Flask-SQLAlchemy是一个轻量级的ORM(对象关系映射)库,用于将Python对象映射到SQL数据库表上,使得在Flask应用中操作数据库变得更加简单。在前后端分离的Flask应用中,它通常用于处理数据层逻辑,包括模型定义、数据库操作和与后端API的交互。 以下是使用Flask-SQLAlchemy的基本步骤,假设我们有一个简单的用户模型: 1. 安装Flask-SQLAlchemy: ```bash pip install Flask-SQLAlchemy ``` 2. 在Flask应用初始化文件(如`app.py`)中设置配置: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_connection_string' db = SQLAlchemy(app) ``` 这里你需要替换`your_database_connection_string`为你实际的数据库连接字符串。 3. 定义数据库模型(User模型): ```python class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def __repr__(self): return f'<User {self.username}>' ``` 4. 创建数据库表(如果表不存在): ```python with app.app_context(): db.create_all() ``` 5. 后端API的路由和CRUD操作: ```python @app.route('/users', methods=['GET']) def get_users(): users = User.query.all() return {'users': [u.to_dict() for u in users]} @app.route('/users/<int:user_id>', methods=['GET']) def get_user(user_id): user = User.query.get_or_404(user_id) return {'user': user.to_dict()} # ...其他增删改查操作 ``` 这里的`to_dict()`方法用于将数据库对象转换为字典以便序列化返回给前端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值