有关SQLAlchemy的使用,查看了几位大牛写的博客,强烈推荐大家去看看:
https://blog.csdn.net/fgf00/article/details/52949973/
https://blog.csdn.net/abcd1f2/article/details/51395561
我又整理一下基础的内容,可以作为参考资料:
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
,这个是表的名字,不是对应类的名字
类型名称 | 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
可选参数 | 描述 |
---|---|
primary_key | 如果设置为True,则为该列表的主键 |
unique | 如果设置为True,该列不允许相同值 |
index | 如果设置为True,为该列创建索引,查询效率会更高 |
nullable | 如果设置为True,该列允许为空。如果设置为False,该列不允许空值 |
default | 定义该列的默认值 |
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是一个对象列表
查询不需要commit,如果不对数据库进行更改,都不需要提交
- 如上代码中my_user是一个对象列表,可以通过获取属性的方式获取最终的值
- 例如通过 my_user.id & my_user.name & my_user.password
对象类型
,类似[user(”1”,”alien”,”123456”),user(“2”,”ping”,”654321”)]
- (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()不能使用
- query.all(),all()返回列表
- query.first():返回第一个元素
- query.one()有且只有一个元素时才正确返回。