当前位置:Gxlcms > 数据库问题 > python之路13:MySQL

python之路13:MySQL

时间:2021-07-01 10:21:17 帮助过:4人阅读

#!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 __author__ = BillyLV 4 5 import pymysql # 导入pymyql模块 6 7 # 创建连接 8 conn = pymysql.connect(host=192.168.199.176, user=root, passwd=root76, db=testdb) 9 # 创建游标 10 cur = conn.cursor() 11 # 执行SQL 12 effect_row = cur.execute(insert into students(name,sex,age,tel) values(%s,%s,%s,%s), (tom, m, 2, 123456)) 13 # 提交 14 conn.commit() 15 # 关闭游标 16 cur.close() 17 # 关闭连接 18 conn.close() 19 20 # 打印影响行数 21 print(effect_row) 插入数据 技术图片
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = BillyLV
 4 
 5 import pymysql  # 导入pymyql模块
 6 
 7 # 创建连接
 8 conn = pymysql.connect(host=192.168.199.176, user=root, passwd=root76, db=testdb)
 9 # 创建游标
10 cur = conn.cursor()
11 
12 list1 = [
13      (tom, m, 2, 1),
14      (jerry, m, 2, 2),
15      (bill, m, 2, 3),
16      (lily, f, 2, 4),
17      (rain, m, 2, 5),
18      (alice, f, 2, 6),
19     ]
20 # 执行SQL
21 effect_row = cur.executemany(insert into students(name,sex,age,tel) values(%s,%s,%s,%s), list1)
22 # 提交
23 conn.commit()
24 # 关闭游标
25 cur.close()
26 # 关闭连接
27 conn.close()
28 
29 # 打印影响行数
30 print(effect_row)
批量插入数据 技术图片
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = BillyLV
 4 
 5 import pymysql  # 导入pymyql模块
 6 
 7 # 创建连接
 8 conn = pymysql.connect(host=192.168.199.176, user=root, passwd=root76, db=testdb)
 9 # 创建游标
10 cur = conn.cursor()
11 
12 list1 = [
13     bill,
14     lily,
15     rain,
16     alice,
17     ]
18 # 执行一条SQL
19 effect_row = cur.execute("delete from students where name=‘test‘")
20 # 执行多条SQL
21 effect_row = cur.executemany(delete from students where name=(%s), list1)
22 
23 # 提交
24 conn.commit()
25 
26 # 打印影响行数
27 print(effect_row)
28 # 打印最后行id
29 print(cur.lastrowid)
30 
31 # 关闭游标
32 cur.close()
33 # 关闭连接
34 conn.close()
删除数据 技术图片
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = BillyLV
 4 
 5 import pymysql  # 导入pymyql模块
 6 
 7 # 创建连接
 8 conn = pymysql.connect(host=192.168.199.176, user=root, passwd=root76, db=testdb)
 9 # 创建游标
10 cur = conn.cursor()
11 
12 # 执行一条SQL
13 effect_row = cur.execute(update students set name=%s where id=2, ta)
14 
15 # 提交
16 conn.commit()
17 
18 # 打印影响行数
19 print(effect_row)
20 # 打印最后行id
21 print(cur.lastrowid)
22 
23 # 关闭游标
24 cur.close()
25 # 关闭连接
26 conn.close()
更改数据 技术图片
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = BillyLV
 4 
 5 import pymysql  # 导入pymyql模块
 6 
 7 # 创建连接
 8 conn = pymysql.connect(host=192.168.199.176, user=root, passwd=root76, db=testdb)
 9 # 创建游标
10 cur = conn.cursor()
11 
12 # 执行SQL并返回受影响行数
13 effect_row = cur.execute(select * from students)
14 
15 # 返回下一条数据
16 print(cur.fetchone())
17 # 向下滚动5行,从下一行开始数数
18 cur.scroll(5, mode=absolute)
19 print(cur.fetchone())
20 # 向上滚动3行,从当前行开始数数
21 cur.scroll(-3, mode=relative)
22 print(cur.fetchone())
23 
24 # 返回指定大小条数的数据
25 print(cur.fetchmany(2))
26 # 返回所有数据
27 print(cur.fetchall())
28 
29 # 获取最新自增ID
30 print(cur.lastrowid)
31 # 打印影响行数
32 print(effect_row, rows)
33 
34 # 关闭游标
35 cur.close()
36 # 关闭连接
37 conn.close()
查询数据

 

 ORM框架SQLAchemy

ORM介绍

orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。

技术图片

orm的优点:

  1. 隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
  2. ORM使我们构造固化数据结构变得简单易行。

缺点:

  1. 无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。

sqlalchemy介绍

SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

技术图片

组成部分:

  • Engine,框架的引擎
  • Connection Pooling ,数据库连接池
  • Dialect,选择连接数据库的DB API种类
  • Schema/Types,架构和类型
  • SQL Exprression Language,SQL表达式语言

SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和DBAPI进行交流,根据配置文件的不同调用不同的DBAPI,从而实现对DB的操作,如:

MySQL-Python
    mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
    
pymysql
    mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
    
MySQL-Connector
    mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
    
cx_Oracle
    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
    
更多:http://docs.sqlalchemy.org/en/latest/dialects/index.html

安装sqlalchemy

pip3 install sqlalchemy -i 技术图片http://pypi.douban.com/simple  --trusted-host 技术图片pypi.douban.com 

sqlalchemy基本使用

 步骤一:

使用 Engine/ConnectionPooling/Dialect 进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。

技术图片
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = BillyLV
 4 
 5 from sqlalchemy import create_engine
 6 
 7 engine = create_engine(
 8     "mysql+pymysql://root:root76@192.168.199.176:3306/testdb?charset=utf8",
 9     max_overflow=5,  # 超过连接池大小外最多创建的连接
10     pool_size=10,  # 连接池大小
11     pool_timeout=6,  # 池中没有线程最多等待的时间,否则报错
12     pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
13 )
14 
15 engine.execute("CREATE TABLE user (id INTEGER NOT NULL AUTO_INCREMENT,name VARCHAR(32),password VARCHAR(64),16 PRIMARY KEY (id))")
17 
18 engine.execute(
19     "insert into user(name,password) values(‘jack‘,‘jackpwd‘)"
20 )
21 
22 result = engine.execute(select * from user)
23 print(result.fetchall())
create&insert table

步骤二:

使用 Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 进行数据库操作。Engine使用Schema Type创建一个特定的结构对象,之后通过SQL Expression Language将该对象转换成SQL语句,然后通过 ConnectionPooling 连接数据库,再然后通过 Dialect 执行SQL,并获取结果。 

技术图片
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = BillyLV
 4 
 5 from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey, select
 6 
 7 metadata = MetaData()
 8 
 9 user = Table(user, metadata,
10     Column(id, Integer, primary_key=True),
11     Column(name, String(20)),
12 )
13 
14 color = Table(color, metadata,
15     Column(id, Integer, primary_key=True),
16     Column(name, String(20)),
17 )
18 
19 engine = create_engine("mysql+pymysql://root:root76@192.168.199.176:3306/testdb?charset=utf8", max_overflow=5)
20 conn = engine.connect()
21 
22 # insert
23 sql = user.insert().values(id=8, name=h)
24 conn.execute(sql)
25 
26 # update
27 sql = user.update().values(fullname=user.c.name)
28 sql = user.update().where(user.c.name == cc).values(name=ab)
29 conn.execute(sql)
30 
31 # delete
32 sql = user.delete().where(user.c.id > 3)
33 conn.execute(sql)
34 
35 # select
36 # select_sql = select([user, ])
37 # select_sql = select([user.c.id, user.c.name])
38 # select_sql = select([user.c.name, color.c.name]).where(user.c.id==color.c.id)
39 # select_sql = select([user.c.name]).order_by(user.c.name)
40 select_sql = select([user]).group_by(user.c.id)
41 result = conn.execute(select_sql)
42 output = result.fetchall()
43 print(output)
44 conn.close()
增删改查

步骤三:

使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

技术图片
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = BillyLV
 4 
 5 import sqlalchemy
 6 from sqlalchemy import create_engine
 7 from sqlalchemy.ext.declarative import declarative_base
 8 from sqlalchemy import Column, Integer, String
 9 from sqlalchemy.orm import sessionmaker
10 
11 engine = create_engine("mysql+pymysql://root:root76@192.168.199.176:3306/testdb?charset=utf8", encoding=utf-8,
12                        echo=True, max_overflow=5)
13 
14 Base = declarative_base()  # 生成orm基类
15 
16 
17 class User(Base):
18     __tablename__ = user  # 表名
19     id = Column(Integer, primary_key=True)
20     name = Column(String(32))
21     password = Column(String(64))
22 
23 
24 Base.metadata.create_all(engine)  # 创建表结构
25 
26 Session_class = sessionmaker(bind=engine)  # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
27 Session = Session_class()  # 生成session实例
28 
29 user_obj = User(name="bill", password="123456")  # 生成你要创建的数据对象
30 print(user_obj.name, user_obj.id)  # 此时还没创建对象呢,不信你打印一下id发现还是None
31 
32 Session.add(user_obj)  # 把要创建的数据对象添加到这个session里, 一会统一创建
33 print(user_obj.name, user_obj.id)  # 此时也依然还没创建
34 
35 Session.commit()  # 现此才统一提交,创建数据
36 print(user_obj.name, user_obj.id)
create&insert 技术图片
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = BillyLV
 4 
 5 import sqlalchemy
 6 from sqlalchemy import create_engine
 7 from sqlalchemy.ext.declarative import declarative_base
 8 from sqlalchemy import Column, Integer, String
 9 from sqlalchemy.orm import sessionmaker
10 
11 engine = create_engine("mysql+pymysql://root:root76@192.168.199.176:3306/testdb?charset=utf8", encoding=utf-8,
12                        echo=True, max_overflow=5)
13 
14 Base = declarative_base()  # 生成orm基类
15 
16 
17 class User(Base):
18     __tablename__ = user  # 表名
19     id = Column(Integer, primary_key=True)
20     name = Column(String(32))
21     password = Column(String(64))
22 
23 
24 Base.metadata.create_all(engine)  # 创建表结构
25 
26 Session_class = sessionmaker(bind=engine)  # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
27 Session = Session_class()  # 生成session实例
28 
29 user_obj = User(name="li", password="12345678")  # 生成你要创建的数据对象
30 print(user_obj.name, user_obj.id)  # 此时还没创建对象呢,不信你打印一下id发现还是None
31 
32 Session.add(user_obj)  # 把要创建的数据对象添加到这个session里, 一会统一创建
33 print(user_obj.name, user_obj.id)  # 此时也依然还没创建
34 
35 my_user = Session.query(User).filter_by(name="bill").first()  # 查询user表name为bill的第一条数据
36 print(my_user.id, my_user.name, my_user.password)  # 打印user表name为bill的id、name、password字段
select 技术图片
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = BillyLV
 4 
 5 import sqlalchemy
 6 from sqlalchemy import create_engine
 7 from sqlalchemy.ext.declarative import declarative_base
 8 from sqlalchemy import Column, Integer, String
 9 from sqlalchemy.orm import sessionmaker
10 
11 engine = create_engine("mysql+pymysql://root:root76@192.168.199.176:3306/testdb?charset=utf8", encoding=utf-8,
12                        echo=True, max_overflow=5)
13 
14 Base = declarative_base()  # 生成orm基类
15 
16 
17 class User(Base):
18     __tablename__ = user  # 表名
19     id = Column(Integer, primary_key=True)
20     name = Column(String(32))
21     password = Column(String(64))
22 
23 
24 Base.metadata.create_all(engine)  # 创建表结构
25 
26 Session_class = sessionmaker(bind=engine)  # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
27 Session = Session_class()  # 生成session实例
28 
29 user_obj = User(name="li", password="12345678")  # 生成你要创建的数据对象
30 print(user_obj.name, user_obj.id)  # 此时还没创建对象呢,不信你打印一下id发现还是None
31 
32 Session.add(user_obj)  # 把要创建的数据对象添加到这个session里, 一会统一创建
33 print(user_obj.name, user_obj.id)  # 此时也依然还没创建
34 
35 # my_user = Session.query(User).filter_by(name="bill").first()  # 查询user表name为bill的第一条数据
36 # print(my_user.id, my_user.name, my_user.password)  # 打印user表name为bill的id、name、password字段
37 
38 # 修改,把user表name为bill的第一条数据的name改为alex
39 my_user = Session.query(User).filter_by(name="bill").first()
40 my_user.name = "alex"
41 Session.commit()  # 提交修改
42 print(my_user.id, my_user.name, my_user.password)
update 技术图片
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = BillyLV
 4 
 5 import sqlalchemy
 6 from sqlalchemy import create_engine
 7 from sqlalchemy.ext.declarative import declarative_base
 8 from sqlalchemy import Column, Integer, String
 9 from sqlalchemy.orm import sessionmaker
10 
11 # 设置utf8编码字符集
12 engine = create_engine("mysql+pymysql://root:root76@192.168.199.176:3306/testdb?charset=utf8", encoding=utf-8,
13                        echo=True, max_overflow=5)
14 
15 Base = declarative_base()  # 生成orm基类
16 
17 
18 class User(Base):
19     __tablename__ = user  # 表名
20     id = Column(Integer, primary_key=True)
21     name = Column(String(32))
22     password = Column(String(64))
23 
24     def __repr__(self):
25         return "<User(name=‘%s‘,  password=‘%s‘)>" % (
26             self.name, self.password)
27 
28 
29 Base.metadata.create_all(engine)  # 寻找Base的所有子类,按照子类的结构在数据库中生成对应的数据表信息
30 
31 Session_class = sessionmaker(bind=engine)  # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
32 Session = Session_class()  # 生成session实例
33 
34 user_obj = User(name="li", password="12345678")  # 生成你要创建的数据对象
35 print(user_obj.name, user_obj.id)  # 此时还没创建对象呢,不信你打印一下id发现还是None
36 
37 Session.add(user_obj)  # 把要创建的数据对象添加到这个session里, 一会统一创建
38 print(user_obj.name, user_obj.id)  # 此时也依然还没创建
39 
40 my_user = Session.query(User).filter_by(name="li").first()  # 查询user表name为bill的第一条数据


                  

	 	
                    
                    
                    
                    
                    
                

人气教程排行