MySQLdb支持python2.*,不支持3.* ,python3里面使用PyMySQL模块代替

python3里面如果有报错  django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.

可以在需要的项目中,在__init__.py中添加两行:
import pymysql
pymysql.install_as_MySQLdb()
就可以用 import MySQLdb了。其他的方法与MySQLdb一样

sqlalchemy 

是python中的一款orm框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作

orm框架 (object relational mapping)对象关系映射
把关系数据库的表结构映射到对象上,就是把数据库的表(table),映射为编程语言里面的类(class)

1, 连接数据库

from sqlalchemy import create_engine
engine = create_engine("mysql+mysqldb://root:password@localhost:3306/test")

2,创建表结构

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer
import pymysql #python3里面需要加上这两行
pymysql.install_as_MySQLdb() engine = create_engine("mysql+mysqldb://root:password@localhost:3306/test?charset=utf8",max_overflow=5)
Base = declarative_base() #生成orm基类 class Host(Base): #创建表单
__tablename__ = 'hosts' #表名 以下为表结构属性
id = Column(Integer,primary_key=True,autoincrement=True)
hostname = Column(String(64),nullable=False)
ip_addr = Column(String(64),nullable=False)
port = Column(Integer,default=22)
Base.metadata.create_all(engine) #创建表结构 #寻找Base的所有子类,按照子类的结构在数据库中生成对应的数据表信息
#Base.metadata.drop_all(engine) 删除

查看一下,表结构已经创建好了。

  • 增加数据

    if __name__ == "__main__":
    DBSession = sessionmaker(bind=engine)
    session = DBSession()
    h1 = Host(hostname='localhost',ip_addr='127.0.0.1') #创建host对象,数据库记录
    h2 = Host(hostname='centos',ip_addr='192.168.1.10',port=2333)
    h3 = Host(hostname='ubuntu',ip_addr='172.16.10.23',port=888)
    session.add(h1) #session.add增加单条数据到session
    session.add_all([h2,h3,]) #session.add_all增加多条,列表形式
    session.commit() #提交保存到数据库
  • 删除数据

    session.query(Host).filter(Host.hostname=='ubuntu').delete() #删除hostname=ubuntu的那条数据
    session.commit()
    #先查询,对符合条件的结果delete()
  • 修改数据

    session.query(Host).filter(Host.id==2).update({'port':8855})
    session.query(Host).filter(Host.id==).update({Host.hostname:Host.hostname+'_01'},synchronize_session=False)
    # update({},synchronize_session=False 字符串拼接
    session.query(Host).filter(Host.id==2).update({Host.port:Host.port+10})
    session.commit()
    # 先查询,然后对查询结果 update({字段:值}) 原来的数据是
    +----+-----------+--------------+------+
    | id | hostname | ip_addr | port |
    +----+-----------+--------------+------+
    | 1 | localhost | 127.0.0.1 | 22 |
    | 2 | centos | 192.168.1.10 | 2333 修改之后:| 2 | centos_01 | 192.168.1.10 | 8865
  • 查询
 res = session.query(Host).all()   #返回一个列表,里面是数据的对象形式,有几条数据就有几个对象
print("res:",res)
for i in res: # 可以使用for循环遍历列表取出里面的对象
print(i,i.hostname)
结果:
res: [<__main__.Host object at 0x7f4574423a20>, <__main__.Host object at 0x7f4574423a90>] #一共有两条数据
<__main__.Host object at 0x7f4574423a20> localhost
<__main__.Host object at 0x7f4574423a90> centos_01 ret = session.query(Host).filter(Host.id>2).all() # 返回符合条件的对象列表,如果为空则为[]
结果:[]
res = session.query(Host).filter(Host.id>1).first() # first()取第一条数据 ,等同于
res = session.query(Host).filter(Host.id>1).all()[0]
print(res,res.hostname)
返回:
<__main__.Host object at 0x7f03079fcf60> centos_01 res = session.query(Host.hostname,Host.id).all() #返回 hostname,id列表
print(res)
结果:[('localhost', 1), ('centos_01', 2)] ret = session.query(Host.hostname).filter(Host.id > 1).all() #返回id>2的hostname列表
print(ret)
结果:[('centos_01',)] # filter_by(字段名=?)
ret = session.query(Host).filter_by(hostname='localhost').first() # 返回对象
print(ret.hostname, ret.id)
结果: localhost 1
res = session.query(Host.hostname).filter_by(id=2).all()
print(res)
结果:[('centos_01',)] # 还有更多查询(between,in,and,or,like,order_by,group_by...)
ret = session.query(User.username).filter(User.id.between(1,3)).all()
ret = session.query(User.username).filter(User.id.in_([1,2])).all()
from sqlalchemy import and_,or_
ret = session.query(User.id,User.username).filter(and_(User.id<4,User.username=='alex')).all()
print(ret)

orm一对多关联

sqlalchemy不支持直接修改表结构,把原来的表删除了重新创建以下:

一个group可以对应多个user,一个user只能对应一个group

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer,ForeignKey
from sqlalchemy.orm import sessionmaker
import pymysql
pymysql.install_as_MySQLdb()
engine = create_engine("mysql+mysqldb://root:password@localhost:3306/test",echo=True)
Base = declarative_base() class User(Base):
__tablename__ = 'user_info'
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(64),nullable=False)
group_id = Column(Integer,ForeignKey('user_group.gid')) #生成外键。 一个user只能有一个group,一个group可以有多个user
class Group(Base):
__tablename__ = 'user_group'
gid = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(64),nullable=False)
Base.metadata.create_all(engine)
# 结果:
[test]> desc user_info;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |
| group_id | int(11) | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+----------------+
[test]> desc user_group;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| gid | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |

 添加数据:

第一步:先添加user_group表的数据。因为user_info外键关联group gid。需要先创建group否则会报错

if __name__ == "__main__":
DBSession = sessionmaker(bind=engine)
session = DBSession()
g1 = Group(name='develop')
g2 = Group(name='operation')
g3 = Group(name= 'project')
session.add_all([g1,g2,g3]}
session.commit()
结果:

+-----+-----------+
| gid | name      |
+-----+-----------+
| 1 | develop  |
| 2 | operation |
| 3 | project  |

第二步:添加user_info 表的数据。可以根据group的查询结果插入group_id

u1 = User(name='jack', group_id=g1.gid)  # 错误示例
obj_g2 = session.query(Group).filter(Group.name == 'develop').first()
u2 = User(name='lily', group_id=obj_g2.gid)
obj_g3 = session.query(Group).filter(Group.gid == 2).first()
u3 = User(name='beibei',group_id=obj_g3.gid)
u4 = User(name='huahua',group_id=3)
session.add_all([u1, u2, u3, u4])
session.commit()
得到结果:
MariaDB [test]> select * from user_info;
+----+--------+----------+
| id | name | group_id |
+----+--------+----------+
| 1 | jack | NULL |
| 2 | lily | 1 |
| 3 | beibei | 2 |
| 4 | huahua | 3 |
+----+--------+----------+ u1的group_id为空,可见直接使用g1.gid并没有关联起来
修改一下:
obj_g1 = session.query(Group).filter(Group.gid==1).first()
session.query(User).filter(User.id==1).update({"group_id":obj_g1.gid})
session.commit()
结果:
+----+--------+----------+
| id | name | group_id |
+----+--------+----------+
| 1 | jack | 1 |
| 2 | lily | 1 |
| 3 | beibei | 2 |
| 4 | huahua | 3 |

删除表时,需要先删除user表再删group表

 relationship  通过外键关联进行查询

  • 通过 username 得出所在group的 groupname
在上例中 User表里面添加一行relationship
from sqlalchemy.orm import relationship
class User(Base):
__tablename__ = 'user_info'
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(64),nullable=False)
group_id = Column(Integer,ForeignKey('user_group.gid'))
group = relationship("Group") #添加这一行,relationship与生成表结构无关,仅用于查询方便
查询:
res = session.query(User).filter(User.name=='lily').first()
print('user %s in group:%s ' % (res.name, res.group.name))
结果:
user lily in group:develop

反向查询: relationship参数backref

  • 通过groupname 得出当前组所有的 username
class User(Base):
__tablename__ = 'user_info'
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(64),nullable=False)
group_id = Column(Integer,ForeignKey('user_group.gid'))
group = relationship("Group",backref='xxx')
查询:
res = session.query(Group).filter(Group.name=='develop').first()
for i in res.xxx:
print("group [%s] has user:[%s])"%(res.name,i.name))
结果:
group [develop] has user:[jack])
group [develop] has user:[lily])

join 连表查询

关联关系同上, 修改数据如下:
> select * from user_info;
+----+--------+----------+
| id | name | group_id |
+----+--------+----------+
| 1 | jack | 1 |
| 2 | lily | 1 |
| 3 | beibei | 2 |
| 4 | huahua | 1 |
| 5 | nini | NULL | [test]> select * from user_group;
+-----+-----------+
| gid | name |
+-----+-----------+
| 1 | develop |
| 2 | operation |
| 3 | project |
+-----+-----------+ res = session.query(User).join(Group).all() #默认inner join
for i in res:
print(i,i.name)
结果:
<__main__.User object at 0x7fa7cd881208> jack
<__main__.User object at 0x7fa7cd881278> lily
<__main__.User object at 0x7fa7cd8812e8> beibei
<__main__.User object at 0x7fa7cd881358> huahua res = session.query(Group).join(User).all()
for i in res:
print(i, i.name)
结果:
<__main__.Group object at 0x7fd85ba63320> develop
<__main__.Group object at 0x7fd85ba730f0> operation res = session.query(User.name,Group.name).join(Group).all()
for i in res:
print(i)
结果:
('jack', 'develop')
('lily', 'develop')
('beibei', 'operation')
('huahua', 'develop') res = session.query(Group).outerjoin(User).all() #outer join
for i in res:
print(i,i.name)
结果
<__main__.Group object at 0x7f7bf4e9a358> develop
<__main__.Group object at 0x7f7bf4eaa128> operation
<__main__.Group object at 0x7f7bf4eaa978> project

orm多对多关联

学校有学生和老师两种角色,一个老师有多个学生,一个学生也可以有多个老师,如果通过建立外键来关联是无法满足需求的。这个时候需要通过建立第三张表-中间表来表示两者之间的关联关系:

步骤:

from sqlalchemy import create_engine,Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer,ForeignKey
from sqlalchemy.orm import sessionmaker,relationship
import pymysql #python3里面需要加上这两行
pymysql.install_as_MySQLdb()
engine = create_engine("mysql+mysqldb://root:password@localhost:3306/test?charset=utf8",max_overflow=5,echo=True)
Base = declarative_base() #生成orm基类
StuToTea=Table('stu_to_tea',Base.metadata, #创建一个中间表,关联teacher和student表
Column('students_id',ForeignKey('students.id'),primary_key=True),
Column('teachers_id', ForeignKey('teachers.id'), primary_key=True),
)
class Teacher(Base): #创建表单
__tablename__ = 'teachers' #表名 以下为表结构属性
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(64),nullable=False)
rela_student = relationship('Student',secondary=StuToTea,backref = 'rela_teacher') #secondary指定中间表
class Student(Base):
__tablename__ = 'students' #表名 以下为表结构属性
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(64),nullable=False)
Base.metadata.create_all(engine)

插入一些数据:

if __name__ == '__main__':
DBsession = sessionmaker(bind=engine)
session = DBsession()
s1 = Student(name='小王')
s2 = Student(name='小李')
s3 = Student(name='小杨')
s4 = Student(name='小红')
s5 = Student(name='小明')
t1 = Teacher(name='老丁')
t2 = Teacher(name='老唐')
t3 = Teacher(name='老陈')
t1.rela_student = [s1,s2] #通过关联关系,创建关联的数据到stu_to_tea表中。
t2.rela_student = [s2,]
t3.rela_student = [s3,s4,s5]
#也可以先创建tea,stu两张表,后面通过查询语句,例如:
# obj_t1 = session.query(Teacher).filter(Teacher.id==1).first()
# s_all = session.query(Student).all()
# obj_t1.rela_student = s_all #通过关联关系来创建
session.add_all([s1,s2,s3,s4,s5,t1,t2,t3])
session.commit()

查找:

t1 = session.query(Teacher).filter(Teacher.id==1).first()
print(t1.rela_student) #查找id=1的老师对应的学生
结果:
[<__main__.Student object at 0x7f8096aa2cc0>, <__main__.Student object at 0x7f8096aa2d30>] 可以在class Student(Base):下面加上
def __repr__(self):
return 'id:%s, name:%s'%(self.id,self.name)
结果返回:
[id:1, name:小王, id:2, name:小李]

也可以反向查询:

s2 = session.query(Student).filter(Student.id==2).first()
print(s2.rela_teacher)
结果:
[id:1, name:老丁, id:2, name:老唐]

删除关联关系:

删除某一个关联关系。例如删除老丁下的小王:
t = session.query(Teacher).filter(Teacher.name=='老丁').first()
s = session.query(Student).filter(Student.name=='小王').first()
t.rela_student.remove(s)
session.commit()
假如小李转学了,删除小李,会自动删除所有与之相关的关联。
obj_s = session.query(Student).filter(Student.name=='小李').first()
session.delete(obj_s)
session.commit()

python中mysql数据库的操作-sqlalchemy的更多相关文章

  1. Qt中MySQL数据库的操作例程

    数据库连接不成功时,要将libmysql.dll放到C:\Qt\Qt5.11.0\5.11.0\mingw53_32\bin和C:\Qt\Qt5.11.0\5.11.0\msvc2017_64\bin ...

  2. python 中mysql数据库的读写

    1.读取数据库 import pymysql id=[] name=[] explain=[] db=pymysql.Connection(host=,user="root", p ...

  3. python之(mysql数据库操作)

    前言:关心3步骤(此文章只针对python自动化根基展开描述) 什么是mysql数据库操作?  答:利用python对mysql数据库进行增, 删, 改, 查 操作 为什么要用python对mysql ...

  4. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

  5. python的mysql数据库操作

    python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...

  6. django 中连接mysql数据库的操作步骤

    django中连接mysql数据库的操作步骤: 1 settings配置文件中 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mys ...

  7. 利用workbench对linux/Ubuntu系统中的mysql数据库进行操作

    在上一篇文章中,我分享了在linux中如何安装mysql数据库,但是这只是安装了mysql的服务,并没有图形化管理界面,所以这样子操作起来并没有那么方便,那么现在我们就来实现如何利用在window中安 ...

  8. 使用python读取mysql数据库并进行数据的操作

    (一)环境的配置 使用python调用mysql数据库要引进一些库. 目前我使用的python版本是python3.6.引进库为pymysql 其他对应的库可以有以下选择: mysqldb,oursq ...

  9. python专题-Mysql数据库(python2._+ Mysqldb)

    Python使用MySQL数据库 MySQLdb驱动从2014年1月停止了维护. Python2 MySQLdb 一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安 ...

随机推荐

  1. 《Mysql 分区分表》

    一:分区/分表 为了什么? - 当MySQL单表的数据量过大时,数据库的访问速度会下降,需要处理大量数据,所以需要把数据分散存储. - 常用 "水平" 切分 二:MySQL常见的水 ...

  2. Linux Input子系统

    先贴代码: //input.c int input_register_handler(struct input_handler *handler) { //此处省略很多代码 list_for_each ...

  3. CentOS 7静默安装Oracle 11g R2数据库软件

    之前安装Oracle 11g R2数据库软件都是建立在图形界面上的,不过现在大部分服务器上都没有安装图形界面.图形界面安装较为方便,安装选项清晰,步骤明确,但Oracle还支持另一种安装方式,就是通过 ...

  4. cocos2d-x 编译 安卓(android)apk文件

    摘要: 一.下载Android环境 搭建Android环境需要用到Android SDK.NDK.Ant和JDK: 下载Android SDK  下载Android NDk  下载Android JD ...

  5. 5.Python3程序结构

    5.1顺序结构 一条语句一条语句顺序的执行. 5.2选择结构 条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: 5.2. ...

  6. UI框架搭建DAY1

    分析:UI框架主要是为了用户(使用框架的程序猿)更快捷.方便地开发UI,UI框架的好处还在于解耦,使得程序更具有灵活性. UI框架的核心是窗口的管理,窗口管理的主要任务就是显示窗口和关闭窗口. 因为窗 ...

  7. nginx配置详细解析

    转自 http://blog.csdn.net/zhongguozhichuang/article/details/528168871.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将 ...

  8. 线程同步——lock锁

    线程同步即解决线程安全问题的第三种方式——使用lock锁 代码实现: 其中,ReentrantLock是lock接口的实现类,这边是使用多态创建,访问成员方法时,编译看左,运行看右: Reentran ...

  9. json字符串、json对象、数组之间的转换

    json字符串转化成json对象 // jquery的方法 var jsonObj = $.parseJSON(jsonStr) //js 的方法 var jsonObj = JSON.parse(j ...

  10. codeforces #305 C Mike and Foam

    首先我们注意到ai<=50w 因为2*3*5*7*11*13*17=510510 所以其最多含有6个质因子 我们将每个数的贡献分离, 添加就等于加上了跟这个数相关的互素对 删除就等于减去了跟这个 ...