SQLAlchemy模块
slqalchemy常见的数据类型
1、Integer:整形,映射到数据库中是int类型
2、Float:浮点类型,映射到数据库中是float类型。它占据的32位
3、Double:双精度浮点类型,映射到数据库中是double类型,占据64位
4、String:可变字符类型,映射到数据库中是varchar类型
5、Boolean:布尔类型,映射到数据库中是tinyint类型
6、Decimal:定点类型,是专门为了解决浮点类型精度丢失的问题的,一般作用于金钱类型
7、Enum:枚举类型,指定某个字段只能是枚举中指定的几个值,不能为其他值
8、Date:存储时间,只能存储年月日,映射到数据库中是date类型
9、Datetime:存储时间,可以存储年月日时分秒
10、Time:存储时间,存储时分秒
11、Text:存储长字符串,映射到数据库是text类型
12、Longtext:长文本类型,映射到数据库中是longtext类型
databases的Python项目详细描述 异步操作数据库的模块 https://www.cnpython.com/pypi/databases
用元数据描述数据库¶: https://docs.sqlalchemy.org/en/14/core/metadata.html?highlight=migrate#altering-schemas-through-migrations
- metadata = MetaData()
- MetaData 是一个容器对象,它将所描述的数据库(或多个数据库)的许多不同功能保存在一起。
- 要表示表,请使用Table类。它的两个主要参数是表名,然后是MetaData将与之关联的 对象。其余的位置参数主要是 Column描述每一列的对象:
有关如何开始将databass与sqlalchemy核心表达式一起使用的示例。 https://www.encode.io/databases/database_queries/
https://www.cnblogs.com/yc-c/p/9627968.html
更详细的操作介绍:https://www.imooc.com/article/22343
Python3 — sqlalchemy https://blog.csdn.net/Ka_Ka314/article/details/82382656
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好) https://www.jb51.net/article/49789.htm
代码示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# auth :huhu
from pymysql import DATE
from sqlalchemy import Column, String, create_engine, VARCHAR, Integer, ForeignKey, Text, Table
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
#创建对象的基类:
Base = declarative_base()
#初始化数据库连接:
db = create_engine('mysql+pymysql://root:100200@127.0.0.1:3306/test1')
#定义student对象:
class Student(Base):
#表的名字:
__tablename__ ='Student'
#表的结构
s_id = Column(String(20),primary_key=True,autoincrement=True)
s_name = Column(String(20),unique=True,nullable=False)
s_birth = Column(String(20),unique=True,nullable=False)
s_sex = Column(String(10))
#返回具体属性,
def __repr__(self):
return '<users (id:%s,name:%s,birth:%s,sex:%s)>' % (self.s_id, self.s_name, self.s_birth,self.s_sex)
#自动创建所有表,通过继承Base的方法,这些方法再通过引擎初始化数据库结构
#寻找Base的所有子类,按照子类的结构在数据库中生成对应的数据表信息
Base.metadata.create_all(db)
#创建DBsession类型
DBSession = sessionmaker(bind=db)
#创建session对象
session = DBSession()
'''查询'''
# 创建QUery查询,filter是where条件,最后调用first()返回一行如果调用all()则返回所有行
ret = session.query(Student).filter(Student.s_id == '05').first()
ret1=session.query(Student).filter_by(s_name='王菊').first()
ret2 = session.query(Student).filter_by(s_id = '07').all()#结果是列表
ret3 = session.query(Student).filter(Student.s_id.in_(['05','06'])).all()
ret4 = session.query(Student).order_by(Student.s_id).all()
ret5 = session.query(Student).order_by(Student.s_id)[1:3]
# 打印类型和对象的name属性:
print('type:', type(Student))
print('name:', Student.s_birth)
'''增加,插入单行'''
u = Student(s_id='09',s_name='haha',s_birth="1990-05-01",s_sex='男')
session.add(u)
# 插入多行
session.add_all([Student(s_id='10',s_name='haha1',s_birth="1990-05-01",s_sex='男'),
Student(s_id='11',s_name='haha2',s_birth="1990-05-01",s_sex='男'),
Student(s_id='12',s_name='haha3',s_birth="1990-05-01",s_sex='男')
])
Session.rollback() #此时你rollback一下
# 写入数据库
session.commit()
'''删除'''
session.query(Student).filter(Student.s_id > '10').delete()
#session.commit()
'''修改'''
session.query(Student).filter(Student.s_id == '10').update({'s_name':'feng','s_sex':'女'})
session.commit()
# 关闭Session:
session.close()
'''一对多'''
class Favor(Base):
__tablename__ = 'favor'
nid = Column(Integer, primary_key=True)
caption = Column(String(50), default='red', unique=True) # unique 唯一
class Person(Base):
__tablename__ = 'person'
nid = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=True)
favor_id = Column(Integer, ForeignKey("favor.nid"))
class User(Base):
__tablename__ = 'userlist'
id = Column(Integer, primary_key=True)
username = Column(String(64), nullable=False, index=True)
password = Column(String(64), nullable=False)
email = Column(String(64), nullable=False, index=True)
articles = relationship('Article')#用relationship函数关联两张表
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.username)
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String(64), nullable=False, index=True)
content = Column(Text)
user_id = Column(Integer, ForeignKey('userlist.id'))
author = relationship('User') #用relationship函数关联两张表
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.title)
'''多对多'''
class ServerToGroup(Base):
__tablename__ = 'servertogroup'
nid = Column(Integer, primary_key=True, autoincrement=True)
server_id = Column(Integer, ForeignKey('server.id')) #外键
group_id = Column(Integer, ForeignKey('group.id'))
class Group(Base):
__tablename__ = 'group'
id = Column(Integer, primary_key=True)
name = Column(String(64), unique=True, nullable=False)
class Server(Base):
__tablename__ = 'server'
id = Column(Integer, primary_key=True, autoincrement=True)
hostname = Column(String(64), unique=True, nullable=False)
port = Column(Integer, default=22)
#1 创建关联表:第三张表book_c_author:用来关联下面的authors和books表
# 这张关系表不必使用类创建可以直接使用Table创建,因为这张表创建后不必手动向表中插数据
# 对这张表的维护完全是由ORM自己维护的
# 表中仅有两个字段:book_id关联books表的id,author_id关联authors表的id
# 这张表创建完成后必须要在books表和authors表中指定要到book_c_author表查询
book_c_author = Table('book_c_author', Base.metadata,
Column('book_id',Integer,ForeignKey('books.id')),
Column('author_id',Integer,ForeignKey('authors.id')),
)
#2 创建books表:用来存储所有的书
class Book(Base):
__tablename__ = 'books'
id = Column(Integer,primary_key=True)
name = Column(String(64))
pub_date = Column(DATE)
authors = relationship('Author',secondary=book_c_author,backref='books')
# books通过authors关联Author表,Book通过字段secondary去查第三张表:book_c_author
# backref='books'用来反向查一个作者有多少本书
def __repr__(self):
return self.name
#3 创建authors表:用来存储所有作者的名字
class Author(Base):
__tablename__ = 'authors'
id = Column(Integer, primary_key=True)
name = Column(String(32))
def __repr__(self):
return self.name