总结SQLAlchemy使用相关

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

SQLAlchemy初识

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值