Python中ORM框架SQLAlchemy的使用说明

有关SQLAlchemy的使用,查看了几位大牛写的博客,强烈推荐大家去看看:
https://blog.csdn.net/fgf00/article/details/52949973/
https://blog.csdn.net/abcd1f2/article/details/51395561
我又整理一下基础的内容,可以作为参考资料:

      • 1.创建表格结构:不同类型的字段如何设计
        • 基本创建表格案例
        • 常用字段类型设计
        • 常见的SQLALCHEMY里字段类型与python的对比
        • 常见的SQLALCHEMY列选项
      • 2.查询时相关问题
        • (1) Session.commit() 提交事务的使用场景
        • (2) filter()获取到的对象
        • (3) filter() & filter_by()区别
        • (4) first() & all() & one()的区别

1.创建表格结构:不同类型的字段如何设计

基本创建表格案例

from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey
from sqlalchemy.orm import mapper

metadata = MetaData()

user = Table('user', metadata,
            Column('id', Integer, primary_key=True),
            Column('name', String(50)),
            Column('fullname', String(50)),
            Column('password', String(12))
        )

class User(object):
    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password

mapper(User, user)  # 类User 和 表user关联起来

# 如果数据库里有user表格了,再次运行创建表格的程序也不会再去创建了

常用字段类型设计

(1)primary_key字段,整数类型,主键,整数类型的主键默认为自动增长
Column(Integer(), primary_key=True)

(2)nullable字段,字符串类型,最大长度30,设置为NOT NULL
Column(String(30), nullable=False)

(3) Enum字段,枚举类型
Column(Enum(‘male’, ‘female’))

(4)autoincrement 自增长字段
Column(Integer, primary_key=True, autoincrement=True)

(5)ForeignKey 外键关联
Column ( Integer, ForeignKey (“stu2.id”) )
stu2,这个是表的名字,不是对应类的名字

常见的SQLALCHEMY里字段类型与python的对比

类型名称 python类型 描述
Integer int 常规整形,通常为32位
SmallInteger int 短整形,通常为16位
BigInteger int或long 精度不受限整形
Float float 浮点数
Numeric decimal.Decimal 定点数
String str 可变长度字符串
Text str 可变长度字符串,适合大量文本
Unicode unicode 可变长度Unicode字符串
Boolean bool 布尔型
Date datetime.date 日期类型
Time datetime.time 时间类型
Interval datetime.timedelta 时间间隔
Enum str 字符列表
PickleType 任意Python对象 自动Pickle序列化
LargeBinary str 二进制

备注,引用方式:

from sqlalchemy import Table, MetaData, Column, Integer, String, Enum, Float, Boolean

常见的SQLALCHEMY列选项

可选参数 描述
primary_key 如果设置为True,则为该列表的主键
unique 如果设置为True,该列不允许相同值
index 如果设置为True,为该列创建索引,查询效率会更高
nullable 如果设置为True,该列允许为空。如果设置为False,该列不允许空值
default 定义该列的默认值

2.查询时相关问题

from sqlalchemy import create_engine
from sqlalchemy import Table, MetaData, Column, Integer, String
from sqlalchemy.orm import mapper, sessionmaker
# 创建实例,并连接test库
engine = create_engine("mysql+pymysql://root:123456@localhost/test",
                                    encoding='utf-8', echo=True)

metadata = MetaData()

user = Table('user', metadata,
            Column('id', Integer, primary_key=True),
            Column('name', String(50)),
            Column('password', String(12))
        )
class User(object):
    def __init__(self, name, id, password):
        self.id = id
        self.name = name
        self.password = password
    def __repr__(self):
        return "" % (self.name, self.password)

mapper(User, user)
# 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
Session_class = sessionmaker(bind=engine)
Session = Session_class()  # 生成session实例

# 查询第一个
my_user = Session.query(User).filter_by(name="fgf").first()

# 查询所有 
# my_user = Session.query(User).filter_by().all()  
print(my_user)   #my_user是一个对象列表

(1) Session.commit() 提交事务的使用场景

查询不需要commit,如果不对数据库进行更改,都不需要提交

(2) filter()获取到的对象

  • 如上代码中my_user是一个对象列表,可以通过获取属性的方式获取最终的值
  • 例如通过 my_user.id & my_user.name & my_user.password
  • 对象类型,类似[user(”1”,”alien”,”123456”),user(“2”,”ping”,”654321”)]

(3) filter() & filter_by()区别

  • (1) filter()不支持组合查询,只能连续调用filter来变相实现。例如:q = sess.query(IS).filter(IS.node == node and IS.password == password).all()
  • (2) 如上方法中and后面的条件既不报错,又不生效,需要连续调用
  • (3) filter可连续调用:
    q = sess.query(IS).filter(IS.node == node).filter(IS.password == password).all()
  • (4) filter_by:
    q = sess.query(IS).filter_by(node=node, password=password).all()
  • (5) filter()可以使用>&<,但是filter_by()不能使用

(4) first() & all() & one()的区别

  • query.all(),all()返回列表
  • query.first():返回第一个元素
  • query.one()有且只有一个元素时才正确返回。

你可能感兴趣的:(Python基础)