【爬虫高阶】Mysql安装与配置以及三种方式实现表格数据的增添删改

1. 安装和配置

mysql安装与配置参考网址,如果在安装过程中的存在下面提醒,可以参考问题解决
在这里插入图片描述

2. 安装对应的python模块

安装pymysql和sqlalchemy模块,打开命令行窗口输入如下代码,一般就可以自动安装完毕

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pysql sqlalchemy

→ 输出的结果为:
在这里插入图片描述

3. 数据库连接

首先需要先创建一个数据库,如下,打开cmd,使用mysql -u root -p进行登录,需要输入自己的账户密码,这一步在mysql的安装与配置中已经详细过了,然后就是创建一个新的数据库并命名

 create database test;

→ 输出的结果为:(注意上面的语句最后是由英文分号的)
在这里插入图片描述
在python中创建引擎,代码如下

from sqlalchemy import create_engine

engine = create_engine(
	'mysql+pymysql://root:[email protected]:3306/test',
	max_overflow = 5, #超过连接池大小外最多可以创建的连接
	pool_size = 10, #连接池的大小
	echo = True #调试信息展示
	)
	
print('连接成功')

→ 输出的结果为:(其中第一个root为用户名,一般是默认的即可,第二个root就是用户设置的密码,这里是使用root占位,在输入时需要输入自己的密码)

连接成功

4. 数据库中的数据类型与python中的数据类型

基础知识,两者数据类型的练习如下表

SQLAchemy Python
Text Long str
Boolean bool
Biginteger int
Date Datetime.date
DateTime Datetime. datetime
Float float
String string

代码实现数据库的连接并实现表格的写入,如下,

from sqlalchemy import Column,String,Integer,Boolean,DateTime
from sqlalchemy import create_engine,MetaData,Table
from datetime import datetime

engine = create_engine(
	'mysql+pymysql://root:[email protected]:3306/test',
	max_overflow = 5,  #超过连接池大小外最多可以创建的连接
	pool_size = 10,    #连接池的大小
	echo = True,        #调试信息展示
	)
	
metadata = MetaData()
user = Table('user',metadata,
	Column('id',Integer,primary_key=True,autoincrement=True),
	Column('name',String(255)),
 	Column('data',DateTime(),default=datetime.now, onupdate=datetime.now),
	Column('man',Boolean(),default=False)
	)
	
metadata.create_all(engine)
print('连接成功')

在cmd中查看创建的表格信息,如下(已经创建了一个test表格了,这里创建的user是第二个表格)
在这里插入图片描述

5. 原生语句进行数据的增添删改

① 插入数据 insert into table(key1,key2) values(value1,value2),如下,下面的user就是创建的table的名称

engine.execute("insert into user(name) values('lx');")

→ 输出的结果为:(第一次查询的时候是显示空,在程序运行之后再刷新,就显示出插入的信息了,这里只插入了一个键对应的信息,如果要插入多个键对应的信息,在括号里面需要使用逗号分隔,并输入键名,同样对value里面的值也是如此)
在这里插入图片描述
② 更新数据 update table set key1 = value1,key2 = value2,where…,如下

engine.execute("update user set id = 5,name = 'python' where id=1;")

→ 输出的结果为:(user表格中的数据已经更新了)
在这里插入图片描述
③ 查询数据 select * from table

data = engine.execute("select * from user;")
for i in data:
	print(i)

→ 输出的结果为:(由于只插入了一条数据,所以遍历循环只有一条信息输出)

(5, 'python', None, None)

④ 删除数据 delete from table where…

engine.execute("delete from user where id = 5;")

→ 输出的结果为:(因为刚刚更新表格的时候把id变成了5,所以这里删除的话就是id=5)
在这里插入图片描述

6. 用表结构增添删改

① 插入数据 table.insert(),注意这个语句后面是逗号不是点

from sqlalchemy import Column,String,Integer,Boolean,DateTime
from sqlalchemy import create_engine,MetaData,Table
from datetime import datetime
engine = create_engine(
	'mysql+pymysql://root:[email protected]:3306/test',
	max_overflow = 5,  #超过连接池大小外最多可以创建的连接
	pool_size = 10,    #连接池的大小
	echo = True,        #调试信息展示
	)
metadata = MetaData()
user = Table('user',metadata,
	Column('id',Integer,primary_key=True,autoincrement=True),
	Column('name',String(255)),
 	Column('data',DateTime(),default=datetime.now, onupdate=datetime.now),
	Column('man',Boolean(),default=False)
	)

conn = engine.connect()
conn.execute(user.insert(),{'name':'mysql'})
conn.close()

→ 输出的结果为:(每一次增加,都是基于上一个数据的基础上,所以这里的id是为6,即使在这个表里的数据进行了删除)
在这里插入图片描述
② 更新数据 table.update().where() .values()注意中间连接的方式是点不是逗号

conn = engine.connect()
# conn.execute(user.insert(),{'name':'mysql'})
conn.execute(user.update().where(user.c.id==6).values(name='c++'))
conn.close()

→ 输出的结果为:(前面的都不变,只需要将插入的语句变成更新数据的语句即可)
在这里插入图片描述
③ 查询数据 select([table.c.key1,table.c.key2…])

from sqlalchemy import select
#需要先导入select模块

conn = engine.connect()
# conn.execute(user.insert(),{'name':'mysql'})
# conn.execute(user.update().where(user.c.id==6).values(name='c++'))
data = conn.execute(select([user.c.name,]))
print(data.fetchall())
conn.close()

→ 输出的结果为:(因为取得是name和data字段,所以最后输出的就是这两个字段对应的数据)

[('c++', datetime.datetime(2020, 4, 20, 23, 6, 34))]

④ 删除数据 table.delete().where(table.c.key1,…)

conn = engine.connect()
# conn.execute(user.insert(),{'name':'mysql'})
# conn.execute(user.update().where(user.c.id==6).values(name='c++'))
# data = conn.execute(select([user.c.name,user.c.data]))
# print(data.fetchall())
conn.execute(user.delete().where(user.c.id==6))
conn.close()

→ 输出的结果为:(数据再一次被删除)
在这里插入图片描述

7. 集成ORM操纵数据库

★★★★★必须要掌握的方式

Declarative_base : 用于创建数据库表类的基类

Sessionmaker : 用于代替conn,执行数据库操作语句

from sqlalchemy import  create_engine,Column,String,Integer
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(
	'mysql+pymysql://root:[email protected]:3306/test',
	max_overflow = 5,  #超过连接池大小外最多可以创建的连接
	pool_size = 10,    #连接池的大小
	echo = True,        #调试信息展示
	)

Base = declarative_base()
class Host(Base):
    __tablename__ = 'hosts'
    id = Column(Integer,primary_key=True,autoincrement=True)
    hostname = Column(String(64),unique=True,nullable=False)
    ip_addr = Column(String(128),unique=True,nullable=False)
    port = Column(Integer,default=8080)

Base.metadata.create_all(engine)

→ 输出的结果为:(已经创建了hosts表格,并且插入了相应的数据)
在这里插入图片描述
① 添加数据sess.add()/sess.add_all()
(注释掉最后创建列表的语句,然后添加一个接口,进行数据的添加)

# Base.metadata.create_all(engine)
if __name__ == '__main__':
    Session = sessionmaker(bind=engine)
    sess = Session()
    h = Host(hostname='test1',ip_addr='127.0.0.1')
    h2 = Host(hostname='test2',ip_addr='192.168.1.1',port=8001)
    h3 = Host(hostname='test3', ip_addr='192.168.1.2', port=8002)
    
    sess.add(h)
    sess.add_all([h2,h3])
    sess.commit()

→ 输出的结果为:(添加一条数据是add,如果是多条的话,就是add_all,然后以列表的方式添加,最后别忘记提交数据到数据库)
在这里插入图片描述
② 删除数据 sess.query(table).filter(条件).delete()

# sess.add(h)
# sess.add_all([h2,h3])
sess.query(Host).filter(Host.id>1).delete()
sess.commit()

→ 输出的结果为:(将上面的添加数据修改为删除数据的语句,filter()括号里面填写的筛选条件)
在这里插入图片描述
③ 更新数据 sess.query(table).filter(条件).update({内容})

# sess.add(h)
# sess.add_all([h2,h3])
# sess.query(Host).filter(Host.id>1).delete()
sess.query(Host).filter(Host.id==1).update({'port':9999})
sess.commit()

→ 输出的结果为:(数据已经完成更新)
在这里插入图片描述
④ 查询数据 sess.query(table).filter_by(id=1).all()

data = sess.query(Host).filter_by(id=1).all()
for i in data:
    print(i.hostname,i.port)
sess.commit()

→ 输出的结果为:

test1 9999
原创文章 159 获赞 93 访问量 4万+

猜你喜欢

转载自blog.csdn.net/lys_828/article/details/105645084