sqlalchemy基础操作

上周上级给个任务用selenium爬去企查查,将字段写到mysql中,本来想着用pandas处理完直接用to_sql直接写入mysql,但是因为爬取的数据有字典和数组,pandas处理后有点问题,就只能另寻方法,一开始脑中第一个想法的是pymysql,但是这种的需要自己写sql语句,就暂时pass了,想到之前还有一个数据库ORM工具SQLAlchemy

SQLAchemy是python的一个数据库ORM工具,支持多种数据引擎(sqlite,mysql,postgres, mongodb等),这里记录基本的用法和笔记

安装

pip install SQLAlchemy
pip install pymysql

使用

连接数据库字符串

mysql+pymysql://root:password@localhost:3306/{db_name}?charset=utf8

更多数据库连接请看这里

连接数据库

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

create_engine(  'mysql+pymysql://root:[email protected]:3306/spider?charset=utf8',
            echo=False)
# echo控制是否打印sql语言,True为打印

# 创建会话类
DB_Session = sessionmaker(bind=engine)

# 创建会话对象
session = DB_Session()

# 用完记得关闭,也可以用with
session.close()

操作数据库

上面创建了一个session对象,接下来就能操作数据库


session.execute('select * from User')
session.execute("insert into User(name,age) value('coco','20')")
session.commit()

# 操作数据库进行增删改查记得最后都要commit

ORM

ORM全称是:Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。举例来说就是,我定义一个对象,那就对应着一张表,这个对象的实例,就对应着表中的一条记录。

首先我们定义一个User类,sqlalchemy的模型类继承自一个由declarative_base()方法生成的类,我们先定义一个模块Models.py生成Base类

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String,Integer

Base = declarative_base()

class User(Base):
     #定义数据库名字
     __tablename__ = 'user'
    id = Column(Integer,primary_key=True)
    name = Column('name',String(20))
    # name = Column(String(20))  两种写法都一样
    age = Column('age',Integer)

模型支持的更多类型有

定义完数据库纪要开始创建表了Integer, String, Boolean, Date, DateTime, Float,更多类型包括类型对应的Python的类型参见这里

Column构造函数相关设置

  • name:名称
  • type_:列类型
  • autoincrement:自增
  • default:默认值
  • index:索引
  • nullable:可空
  • primary_key:外键

更多介绍这里

# 1. 创建表(如果表已经存在,则不会创建)
Base.metadata.create_all(engine)

到这数据库创建就完成了

添加数据

添加数据可以以字典的形式添加

2. 添加数据
add_data = {
  ‘name’:'coco',
  'age':10
}
# 使用add,如果已经存在,会报错
session.add(add_data)
session.commit()

# 3 修改数据
# 3.1 使用merge方法,如果存在则修改,如果不存在则插入(只判断主键,不判断unique列)
r.name = 'admin'
session.merge(r)

# 3.2 也可以通过这种方式修改
session.query(Role).filter(Role.id == 1).update({'name': 'admin'})

# 4. 删除数据
session.query(Role).filter(Role.id == 1).delete()

# 5. 查询数据
# 5.1 返回结果集的第二项
user = session.query(User).get(2)

# 5.2 返回结果集中的第2-3项
users = session.query(User)[1:3]

# 5.3 查询条件
user = session.query(User).filter(User.id < 6).first()

# 5.4 排序
users = session.query(User).order_by(User.name)

# 5.5 降序(需要导入desc方法)
from sqlalchemy import desc
users = session.query(User).order_by(desc(User.name))

# 5.6 只查询部分属性
users = session.query(User.name).order_by(desc(User.name))
for user in users:
    print user.name

# 5.7 给结果集的列取别名
users = session.query(User.name.label('user_name')).all()
for user in users:
    print user.user_name

# 5.8 去重查询(需要导入distinct方法)
from sqlalchemy import distinct
users = session.query(distinct(User.name).label('name')).all()

# 5.9 统计查询
user_count = session.query(User.name).order_by(User.name).count()
age_avg = session.query(func.avg(User.age)).first()
age_sum = session.query(func.sum(User.age)).first()

# 5.10 分组查询
users = session.query(func.count(User.name).label('count'), User.age).group_by(User.age)
for user in users:
    print 'age:{0}, count:{1}'.format(user.age, user.count)

# 6.1 exists查询(不存在则为~exists())
from sqlalchemy.sql import exists
session.query(User.name).filter(~exists().where(User.role_id == Role.id))
# SELECT name AS users_name FROM users WHERE NOT EXISTS (SELECT * FROM roles WHERE users.role_id = roles.id)

# 6.2 除了exists,any也可以表示EXISTS
session.query(Role).filter(Role.users.any())

# 7 random
from sqlalchemy.sql.functions import random
user = session.query(User).order_by(random()).first()

session.close()

你可能感兴趣的:(sqlalchemy基础操作)