SQLAlchemy列参数的使用和query函数的使用

简介: SQLAlchemy列参数的使用和query函数的使用

Column常用参数

  • primary_key:True设置某个字段为主键。
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
  • autoincrement:True设置这个字段为自动增长的。
from sqlalchemy import Column, Integer, String
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(50))
  • default:设置某个字段的默认值。在发表时间这些字段上面经常用。
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    status = Column(String(20), default='active')
  • nullable:指定某个字段是否为空。默认值是True,就是可以为空。
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
  • unique:指定某个字段的值是否唯一。默认是False。
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    email = Column(String(100), unique=True)

onupdate:在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候,不会用onupdate的值,只会使用default的值。常用于是update_time字段(每次更新数据的时候都要更新该字段值)。

from sqlalchemy import Column, Integer, String, DateTime, func
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String(50))
    last_updated = Column(DateTime, onupdate=func.now())
  • server_default(服务器端默认值):在数据库层面设置默认值,而不是在Python代码层面。
from sqlalchemy import text
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime, server_default=text('CURRENT_TIMESTAMP'))
  • index(索引):指定是否为该列创建索引,以提高检索速度。
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String(50), index=True)
  • name:指定ORM模型中某个属性映射到表中的字段名。如果不指定,那么会使用这个属性的名字来作为字段名。如果指定了,就会使用指定的这个值作为表字段名。这个参数也可以当作位置参数,在第1个参数来指定。
title = Column(String(50),name='title',nullable=False)
title = Column('my_title',String(50),nullable=False)

代码演示

from datetime import datetime
from sqlalchemy import Column,Integer,DateTime,String
from db_util import Base,Session
class News(Base):
  __tablename__ = 't_news2'
  id = Column(Integer,primary_key = True,autoincrement = True)
  phone = Column(String(11),unique = True)
  title = Column(String(32),nullable = False)
  read_count = Column(Integer,default=1)
  create_time = Column(DateTime,default = datetime.now)
  update_time = Column(DateTime,default = datetime.now, onupdate =datetime.now ) # 当数据更新后,参数的内容才会更改
def create_data():
  new1 = News(phone='16866666666',title='测试列参数')
  with Session() as session:
    session.add(new1)
    session.commit()
def create_data2():
  # new1 = News(phone='16866666666',title='测试列参数') # 不允许重复
  # new1 = News(phone='16866666668') # title不能为空
  # with Session() as session:
  #   session.add(new1)
  #   session.commit()
  with Session() as session:
    new1 = session.query(News).first()  
    new1.read_count = 2
    session.commit()
if __name__ == '__main__':
  # Base.metadata.create_all()
  # create_data()
  create_data2()

代码刨析

  1. id: 主键列,自动递增。
  2. phone: 字符串类型,长度为11,唯一约束。
  3. title: 字符串类型,最大长度为32,不能为空。
  4. read_count: 整数类型,有一个默认值为1。
  5. create_time: 日期时间类型,有一个默认值为当前时间。
  6. update_time: 日期时间类型,有一个默认值为当前时间,并且在更新时会自动更新为新的时间。

这个脚本中还包含了两个函数 create_data()create_data2(),它们用于向数据库中插入数据。

create_data2() 函数中,首先获取了表中的第一个记录,然后将其read_count修改为2,并提交了事务。

请注意,在这个代码中,onupdate=datetime.now 表示在记录更新时,update_time 会被自动更新为当前时间。

query函数的使用

query 函数是 SQLAlchemy 中用于执行数据库查询操作的方法。它通常用于从数据库中检索数据。

基本用法

session.query(ModelClass)

这里的 ModelClass 定义的模型类,它对应了数据库中的表格。query 函数将返回一个查询对象,可以在该对象上继续添加过滤条件、排序规则等,最终执行查询操作以获取符合条件的数据。

常见用法示例

查询所有记录

result = session.query(User).all()

根据条件查询

result = session.query(User).filter(User.name == 'John').all()

查询第一条符合条件的记录

result = session.query(User).filter(User.name == 'John').first()

查询特定列的值

result = session.query(User.name, User.email).all()

添加排序规则

result = session.query(User).order_by(User.name).all()

使用聚合函数

from sqlalchemy import func
result = session.query(func.count(User.id)).scalar()

连接查询

result = session.query(User, Address).join(Address, User.id == Address.user_id).all()

使用filter_by

result = session.query(User).filter_by(name='John').all()
相关文章
|
3月前
|
IDE API 数据库
FastAPI + SQLModel 实战:标准项目结构下,一个模型搞定数据库与 API
SQLModel 实现“一模型双用”:单个类同时作为数据库表与 Pydantic API 模型,天然支持字段校验、类型提示、OpenAPI 文档生成,彻底消除重复定义,提升开发效率与一致性。(239字)
425 4
|
SQL 存储 JSON
Python写入MySQL数据库to_sql()一文详解+代码展示
Python写入MySQL数据库to_sql()一文详解+代码展示
5326 0
Python写入MySQL数据库to_sql()一文详解+代码展示
|
JavaScript 数据库 Python
一篇文章搞懂flask_sqlalchemy常用操作
这篇文章介绍了Flask框架中SQLAlchemy库的常用操作,包括查询、删除和更新数据的方法和技巧。
1055 3
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
1840 1
|
SQL 关系型数据库 MySQL
SQLAlchemy使用指南
**SQLAlchemy 指南**:Python SQL 工具包,提供数据库高级抽象。安装:`pip install sqlalchemy`,加上数据库驱动(如 MySQL: `pip install mysql-connector-python`)。基础使用包括:创建数据库连接、定义模型、创建表、添加/查询/更新/删除数据。高级功能涉及关系映射、原生 SQL 语句及 SQLAlchemy Core。推荐阅读官方文档以深入了解。
1454 1
|
Python Windows
xlrd库报错【AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘】
xlrd库报错【AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘】
630 0
|
存储 关系型数据库 MySQL
(十九)MySQL之表分区篇:涨知识了!携手共探鲜为人知的表分区!
分库分表相信大家都听说过,但(partitioning)表分区这个概念却鲜为人知,MySQL在5.1版本中开始支持了表分区技术,同时在MySQL5.5中进行了优化,自从MySQL支持的绝大部分引擎都开启了表分区功能。
1698 2
|
SQL JSON 关系型数据库
SqlAlchemy 2.0 中文文档(二)(2)
SqlAlchemy 2.0 中文文档(二)
464 2
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。