SQLAlchemy (一)

本文介绍了如何使用SQLAlchemy库的ORM和Core模式进行数据库操作,包括创建数据模型、执行SQL语句、连接不同数据库以及事务管理。重点讲解了ORM的类映射和核心组件SQLExpressionLanguage的应用。
摘要由CSDN通过智能技术生成

概述

SQLAlchemy 库用于与各种数据库交互,你可使用一种类似于 Python 类和语句的方式创建数据模型和查询,SQLAlchemy 可用于连接大多数常见的数据库,比如 Postgres、MySQL、SQLite、Oracle 等:

SQLAlchemy 提供了两种主要的使用模式——SQLAlchemy Core和SQLAlchemy ORM,这为我们使用SQLAlchemy提供了很大的灵活性,两种方式可以单独使用也可以组合使用。

在这里插入图片描述

SQLAlchemy Core 和 SQLAlchemy ORM

SQLAlchemy Core 提供了连接数据库,操作数据的相关组件,其中SQL Expression Language是最为核心的组件,该组件允许我们使用sql语句和表达式实现对数据库进行操作:

engine = create_engine("[db]+[driver]://[username]:[password]@[host]:[port]/[database]")
with engine.connect() as con:
    sql = "SELECT * FROM {table_name};"
    con.execute(sql)

SQLAlchemy ORM类似于对象关系映射(ORM)。通过使用python中的类与数据库中的表相关关联,并在此基础使用类似于python方法的方式来实现对于数据的操作:

class User(db.Model):
    __tableName__ = 'dc_user'
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(16))
    password = db.Column(db.String(16))
    
User.query.get(id)
engine.session.add(User(id,name,password))

安装

SQLAlchemy 可以支持python2.7,python3.6+的python环境

直接从PyPI下载并安装

pip install SQLAlchemy

SQLAlchemy连接数据库需要和数据库对应的Python驱动程序的支持,SQLAlchemy默认直接支持SQLite3,不需要再安装额外的驱动程序,但是再连接其他数据库时候需要安装想要的数据库驱动程序,并且该程序需要支持DBAPI规范:

数据库驱动
Oraclecs_Oracle
Mysqlmysqlclient, pymysql, MySQL-Connector …
PostgreSQLpsycopg2

SQLAlchemy 还支持连接 Drizzle、Firebird、Sybase 和 Microsoft SQL Server。

具体详情可以查看 SQLAlchemy DBAPI

SQLAlchmey Core 连接数据库

  • 首先需要创建对应数据的Engine对象,Engine对象会根据数据库的连接参数为数据库连接池分配空间,并维持SQLAlchmey与数据库的连接,Engine对象通常是针对一种数据库而创建的全局对象。

    from sqlalchemy import create_engine
    """
    需要指明连接数据库所用的驱动 例如连接mysql使用的是pymysql 则需要在creat_engine中的url的[db]+[driver]字段中指明mysql+pymysql
    echo 是否将执行信息打印
    future 是否使用2.0版本中的 Engine 对象来创建
    同时creat_engine方法中也提供了很多参数来用于设置连接数据库,具体可以查看相关源码
    """
    engine = create_engine("[db]+[driver]://[username]:[password]@[host]:[port]/[table/database]", echo=True, future=True)
    

    当创建好engine时,实际上并没有真的去连接数据库,只是将连接的资源所需要进行分配,只有在第一次执行任务的时候才会真正连接到数据库中

  • 再获得Engine对象之后我们就可以连接到数据库中

    with engine.connect() as conn:
    	result = conn.execute("{sql}")
    	print(result.all())
    # 使用with语句来管理Engine对象创建的Connection对象,保证在连接完成后可以自动释放资源,此时execute()执行后SQLAlchmey默认事务仍在执行中并不会自动的提交,当作用域结束释放连接之后会发生回滚,sql语句并不会修改数据库中的数据这时候就需要主动提交事务
    	conn.commit()
    

    同时还可使用一下方式来连接数据库并执行:

    with engine.begin() as conn:
        conn.execute(
        text("INSERT INTO some_table (x, y) VALUES (:x, :y)"),
        [{"x": 6, "y": 8}, {"x": 9, "y": 10}]
        )
    #这种方式直接声明当前的连接块为事务块,会在资源回收后自动的commit
    
  • 在执行sql语句时,一般先写好sql语句的statement之后再将相关的值注入sql语句中,SQLAlchemy Core中也提供相应的实现,我们可以使用text()方法来预先构建sql statement,对于需要注入值的变量,需要用:来标明,之后在execte()时传入对应的字典或者字典数组

    with engine.connect() as conn:
    	sql = text("INSERT INTO some_table (x, y) VALUES (:x, :y)")
        # 插入单条数据
        conn.execute(
    		sql,
    		{"x": 11, "y": 12}
    	)
        # 插入多条数据
    	conn.execute(
    		sql,
    		[{"x": 11, "y": 12}, {"x": 13, "y": 14}]
    	)
    	conn.commit()
    
  • 在连接并执行相关sql语句之后我们就需要对数据中的查询结果进行处理,SQLAlchemy Core中提供了一个Result的类,在一个Result的类对象中保存执行的结果,Result中提供了很多用于转换和读取的方法:

    # 使用元组的方式访问result中的数据
    result = conn.execute(text("select x, y from some_table"))
    for x, y in result:
        pass
    
    # 使用索引的方式
    result = conn.execute(text("select x, y from some_table"))
    for row in result:
          x = row[0]
            
    # 使用访问其中属性的方式       
    result = conn.execute(text("select x, y from some_table"))
    for row in result:
        y = row.y
        print(f"Row: {row.x} {y}")
    
    # 同时Result中还提供将结果转换成字典的方法 Result.mappings()
    result = conn.execute(text("select x, y from some_table"))
    for dict_row in result.mappings():
        x = dict_row['x']
        y = dict_row['y']
    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQLAlchemy中,一对一关系可以通过ForeignKey和relationship来定义。假设我们有两个表,一个是User,一个是Profile,每个用户都有一个唯一的个人资料。我们可以按照以下步骤进行操作: 1. 定义表结构 ```python from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) profile = relationship("Profile", uselist=False, back_populates="user") class Profile(Base): __tablename__ = 'profiles' id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.id')) email = Column(String) user = relationship("User", back_populates="profile") ``` 在这里,我们使用ForeignKey将Profile表与User表关联起来,并使用relationship定义了表之间的关系。在User表中,我们使用back_populates参数来指定Profile表与之关联的属性名,并将uselist参数设置为False,表示每个用户只有一个个人资料。 2. 创建Session并查询数据 ```python from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create_engine('sqlite:///example.db') Session = sessionmaker(bind=engine) session = Session() # 创建用户和个人资料对象并保存到数据库中 user = User(name='Alice') profile = Profile(email='alice@example.com', user=user) session.add(user) session.commit() # 查询用户及其关联的个人资料信息 query = session.query(User).options( relationship(User.profile, uselist=False)).filter_by(name='Alice') # 打印查询结果 for user in query.all(): print(f"User: {user.name}, Email: {user.profile.email}") ``` 在这个例子中,我们首先创建了一个用户对象和一个个人资料对象,并通过relationship建立了它们之间的一对一关系。然后我们将它们保存到数据库中。接着,我们使用query.options()函数来指定我们要查询的属性,其中uselist参数设置为False,表示我们只需要查询每个用户的一个个人资料。最后,我们通过for循环遍历查询结果并打印出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值