基于Python ORM框架的应用开发

本文介绍基于Python ORM框架连接和使用宽表引擎的方法。

前提条件

操作步骤

  1. 执行以下命令,安装MySQL数据库连接模块PyMySQL。

    pip install PyMySQL
  2. 执行以下命令,安装Python的ORM框架SQLAlchemy。

    pip install SQLAlchemy
  3. 配置连接参数。

    engine = create_engine('mysql+pymysql://<user>:<password>@<lindorm_mysql_addr>:33060/<database>', echo=True)

    参数说明

    参数

    说明

    user

    如果您忘记用户密码,可以通过Lindorm宽表引擎的集群管理系统修改密码。具体操作,请参见修改用户密码

    password

    lindorm_mysql_addr

    Lindorm宽表引擎的MySQL兼容地址。如何获取,请参见查看连接地址

    重要
    • 如果应用部署在ECS实例,建议您通过专有网络访问Lindorm实例,可获得更高的安全性和更低的网络延迟。

    • 如果应用部署在本地,在通过公网连接Lindorm实例前,需在控制台开通公网地址。开通方式:在控制台选择数据库连接 > 宽表引擎,在宽表引擎页签单击开通公网地址

    • 通过专有网络访问Lindorm实例,lindorm_mysql_addr请填写MySQL兼容地址对应的专有网络地址。通过公网访问Lindorm实例,lindorm_mysql_addr请填写MySQL兼容地址对应的公网地址。

    database

    需要连接的数据库名称。默认连接default数据库。

  4. 连接并使用Lindorm宽表引擎。以创建表并插入数据为例。

    #建表
    Base.metadata.create_all(engine)
    
    #创建session对象:
    session = Session()
    #创建Player对象:
    new_player = Player(player_id = 1001, player_name = "john", player_height = 2.08)
    #写入到Lindorm
    session.add(new_player)
    #写入多条数据到Lindorm
    session.add_all([
        Player(player_id=1002, player_name="bob", player_height=1.65),
        Player(player_id=1003, player_name="smith", player_height=1.82),
    ])
    session.commit()

完整示例

完整示例代码如下:

from sqlalchemy import create_engine
from sqlalchemy import Column, String, Integer, Float
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import sessionmaker


Base = declarative_base()
# 定义 Player 对象:
class Player(Base):
    # 表的名字:
    __tablename__ = 'player'
    # 表的结构:
    player_id = Column(Integer, primary_key=True,autoincrement=False)
    player_name = Column(String(255))
    player_height = Column(Float)
    def __str__(self):
        return " ".join(str(item) for item in (self.player_id,self.player_name,self.player_height))


# 初始化数据库连接,请根据实际情况修改连接参数
engine = create_engine('mysql+pymysql://user:test@ld-bp1l39h99192d****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com:33060/default', echo=True)
Session = sessionmaker(bind=engine)

#建表
Base.metadata.create_all(engine)

# 创建session对象:
session = Session()
# 创建Player对象:
new_player = Player(player_id = 1001, player_name = "john", player_height = 2.08)
# 写入到Lindorm
session.add(new_player)
# 写入多条数据到Lindorm
session.add_all([
    Player(player_id=1002, player_name="bob", player_height=1.65),
    Player(player_id=1003, player_name="smith", player_height=1.82),
])
session.commit()

# 查询player_id为1001的数据
rows = session.query(Player).filter(Player.player_id == 1001).all()
print([row.__str__() for row in rows])


# 删除player_id为1002的数据
session.query(Player).filter(Player.player_id == 1002).delete()
session.commit()

# 更新player_id为1003的数据
session.query(Player).filter(Player.player_id == 1003).update({"player_name":"brown"})
session.commit()

# 查询所有数据
rows = session.query(Player).all()
print([row.__str__() for row in rows])

执行成功后将返回如下查询结果

['1001 john 2.08']
['1001 john 2.08', '1003 brown 1.82']