上周上级给个任务用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()