SQLAlchemy使用笔记(一)
简介:SQLAlchemy 是 Python 中最流行的 ORM(对象关系映射)工具之一,它允许开发者通过操作Python 类和对象实现对数据库的增删改查,无需直接编写 SQL,同时也保留了底层 SQL 的灵活性。
文章目录
- 一、连接数据库
- 二、创建数据表
- 2.1、使用 MetaData
- 2.2、使用declarative_base
- 三、插入数据
- 3.1、Core方式
- 3.2、ORM 方式
一、连接数据库
使用 SQLAlchemy 连接数据库主要通过 create_engine() 函数创建引擎(Engine),再通过引擎建立与数据库的连接。
def test_mysql_connection(username, password, host, port, database):"""测试MySQL数据库连接是否成功"""try:# 构建MySQL连接字符串connection_string = f"mysql+pymysql://{username}:{password}@{host}:{port}/{database}"# 创建引擎,设置连接超时engine = create_engine(connection_string,connect_args={"connect_timeout": 10} # 10秒连接超时)# 尝试连接并获取数据库版本信息with engine.connect() as conn:result = conn.execute(text("SELECT VERSION()"))db_version = result.scalar()return (True, f"MySQL连接成功!数据库版本: {db_version}")except Exception as e:return (False, f"连接失败: {str(e)}")
config = {"username": "root", # 替换为你的MySQL用户名"password": "qwe123", # 替换为你的MySQL密码"host": "localhost", # 数据库主机"port": 3306, # MySQL默认端口"database": "mydb" # 数据库名}
success, message = test_mysql_connection(**config) #使用 ** 语法将配置字典转为关键字参数
二、创建数据表
2.1、使用 MetaData
- 使用SQLAlchemy 核心功能(MetaData)创建表的实例,这种方式不依赖 ORM模型,直接通过Table和Column定义表。
# 初始化元数据对象
metadata = MetaData()# 定义表结构
orders = Table('orders', # 表名metadata, #参数 metadata 表示将这个表关联到前面创建的元数据对象# 字段定义Column('id', Integer, primary_key=True, autoincrement=True, comment='订单ID'),Column('user_id', Integer, nullable=False, comment='用户ID'),Column('total_amount', Float, nullable=False, comment='订单总金额'),Column('payment_method', String(30), comment='支付方式'),Column('shipping_address', String(200), comment='收货地址')
)
# 创建所有与metadata关联的表
metadata.create_all(engine)
2.2、使用declarative_base
- 使用declarative_base 实现Python 类继承的方式定义数据库表,将类属性映射为表字段,类本身映射为数据库表。
# 创建基类
Base = declarative_base()# 定义数据模型
class Product(Base):# 表名__tablename__ = 'products'# 字段定义id = Column(Integer, primary_key=True, autoincrement=True, comment='商品ID')name = Column(String(100), nullable=False, comment='商品名称')price = Column(Float, nullable=False, comment='商品价格')created_at = Column(DateTime, default=datetime.now, comment='创建时间')description = Column(String(500), comment='商品描述')# 根据模型创建所有表
Base.metadata.create_all(engine)
三、插入数据
3.1、Core方式
- 要向使用 SQLAlchemy 定义的表中插入数据,可以使用insert()方法构建插入语句,然后通过引擎执行。
# 插入单条数据
def insert_single_order():# 构建插入语句insert_stmt = insert(orders).values(user_id=1001,total_amount=299.99,payment_method='credit_card',shipping_address='北京市朝阳区XX街道XX号')# 执行插入with engine.connect() as conn:result = conn.execute(insert_stmt)conn.commit() # 提交事务print(f"插入成功,新记录ID: {result.inserted_primary_key[0]}")# 插入多条数据
def insert_multiple_orders():# 构建批量插入语句insert_stmt = insert(orders).values([{'user_id': 1002,'total_amount': 159.50,'payment_method': 'alipay','shipping_address': '上海市浦东新区XX路XX号'},{'user_id': 1003,'total_amount': 450.00,'payment_method': 'wechat','shipping_address': '广州市天河区XX街XX号'}])# 执行插入with engine.connect() as conn:result = conn.execute(insert_stmt)conn.commit() # 提交事务print(f"成功插入 {result.rowcount} 条记录")
3.2、ORM 方式
# 创建会话实例
session = Session()# 创建单个商品实例
product1 = Product(name="笔记本电脑",price=5999.99,description="高性能游戏本"
)
# 批量创建商品实例
products = [Product(name="平板电脑", price=2999.00, description="轻薄便携"),Product(name="无线耳机", price=899.00, description="降噪效果好")
]# 添加单个对象
session.add(product1)
# 批量添加多个对象
session.add_all(products)# 提交事务,完成数据插入
session.commit()