Python之路——MySQL操作

一、MySQL数据库基本操作

数据类型:

tinyint(M)  unsigned zerofill      M:宽度,0001;unsigned   无符号数据,  默认0填充

fioat(M,D)   decimal(M,D)       小数,M总位数,D小数点后位数    M不包括小数点      后者更精确,推荐使用

CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。char(10) not null default 'XXX' / varchar(10) not null default 'XXX'; CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。前者检索速度快,后者检索速度相对慢,但节约存储空间。

data   time   datatime   year   ,标准形式YYYY-MM-DD   ,  HH:MM:SS  , YYYY-MM-DD HH:MM:SS  ,  YYYY

基本语句:

mysql> show databases;                                        #查询数据库
mysql> create database mydb;                                  #创建数据库
mysql> drop database mydb;                                    #删除数据库
mysql> use newbodb;                                           #选择要操作的数据库
mysql> \c                                                     #清除编辑语句内容
mysql> show tables;                                           #查询数据库中的表
mysql> create table tab_name(                                 #创建表
    -> id smallint(4) unsigned primary key auto_increment,    #定义主键
    -> name char(10) not null,                                #字段定义
    -> age tinyint unsigned,
    -> post varchar(20) not null default '工程师',
    -> salary decimal(7,2) not null default 0.00
    -> )engine=myisam  charset=utf8;                          #指定 engine  和 charset
mysql> desc tab_name;                                         #显示字段信息
+--------+----------------------+------+-----+-----------+----------------+
| Field  | Type                 | Null | Key | Default   | Extra          |
+--------+----------------------+------+-----+-----------+----------------+
| id     | smallint(4) unsigned | NO   | PRI | NULL      | auto_increment |
| name   | char(10)             | NO   |     | NULL      |                |
| age    | tinyint(3) unsigned  | YES  |     | NULL      |                |
| post   | varchar(20)          | NO   |     | 工程师    |                |
| salary | decimal(7,2)         | NO   |     | 0.00      |                |
+--------+----------------------+------+-----+-----------+----------------+
5 rows in set (0.13 sec)	
mysql> insert into tab_name (name,age,post,salary) values     #增加数据
    -> ('祝融夫人',18,'总经理',13428.00);
mysql> select * from tab_name;                                #查询整表数据
+----+--------------+------+-----------+----------+
| id | name         | age  | post      | salary   |
+----+--------------+------+-----------+----------+
|  1 | 祝融夫人     |   18 | 总经理    | 13428.00 |
|  2 | 孟获         |   21 | 工程师    |  7612.00 |
|  3 | 赵云         |   37 | 马夫      |  6000.00 |
|  5 | 马云         |   37 | 清洁工    |  2800.00 |
+----+--------------+------+-----------+----------+
4 rows in set (0.00 sec)
mysql> select * from tab_name where name='赵云';              #查询数据
mysql> update tab_name set                                    #修改数据
    -> salary = 6000
    -> where name='赵云';
mysql> delete from tab_name where name='马云';                #删除数据
mysql> drop table tab_name;                                   #删除表	
mysql> /*条件包括 where, group by ,having ,order by , limit
   /*> 注意事项:1、先后顺序不能更改;
   /*>           2、group by 必须和 max(), min(),average(),sum(),count()等函数结合使用
   /*>           3、where 针对原表中的字段其作用,having针对查询结果表中的字段起作用
   /*>           4、limit限制查询多少条数据,与sql server/oracle语句的区别*/
mysql> select * from tab_name
    -> where name in(select * from a1);                       #where 子查询
mysql> select a1.name,tab_name.salary from tab_name,a1        
    -> where a1.name = tab_name.name;                         #多表联合查询
mysql> select a1.name,a2.salary from                          #from 子查询
    -> a1,(select * from tab_name where salary <10000) as a2
    -> where a1.name = a2.name
    -> order by a2.salary desc;                               #desc降序排列,默认为asc升序排列
mysql> select * from tab_name where age =18                   #union 连接结果时,字段数相同
    -> union select * from tab_name where name='马云';
mysql> alter table a1 add ismarry char(2);                    #增加字段定义,即表的列操作
mysql> alter table a1 add id smallint unsigned first;         #first第一列增加字段,after XX 在XX列之后增加
mysql> alter table a1 drop id;                                #删除字段
mysql> select a1.name,tab_name.salary from a1                 #左连接查询
    -> left join tab_name on a1.name = tab_name.name; 
+-----------+---------+
| name      | salary  |
+-----------+---------+
| 赵云      | 6000.00 |
| 马云      | 2800.00 |
| 李刚      |    NULL |
| 孙悟空    |    NULL |
+-----------+---------+
4 rows in set (0.00 sec)
mysql> select a1.name,tab_name.salary from a1                 #右连接查询
    -> right join tab_name on a1.name = tab_name.name;
+--------+----------+
| name   | salary   |
+--------+----------+
| 马云   |  2800.00 |
| 赵云   |  6000.00 |
| NULL   | 13428.00 |
| NULL   |  7612.00 |
+--------+----------+
4 rows in set (0.00 sec) 
mysql> select a1.name,tab_name.salary from a1                 #内连接查询
    -> inner join tab_name on a1.name = tab_name.name;
+--------+---------+
| name   | salary  |
+--------+---------+
| 赵云   | 6000.00 |
| 马云   | 2800.00 |
+--------+---------+
2 rows in set (0.00 sec)
mysql> delimiter $                                            #修改语句分割标识
mysql> create trigger tg1 after insert on tab_name            
    -> for each row begin                                     #for each row 标识行触发器
    -> insert into a1 values(new.name,'是');
    -> end$                                                   #begin...end 之间可包含多条sql语句
mysql> delimiter ;                                            #回退语句分割标识
mysql> /*trigger触发时间:after,before
   /*>   trigger触发事件:insert, update, delete
   /*>   具有相同触发时间和触发事件的给定表,不能有两个或多个触发器
   /*>   创建触发器前后须修改语句分割符:delimiter
   /*>   使用别名能够引用与触发程序相关的表中的列:new.XXX  old.XXX*/
mysql> show triggers;                                         #查询触发器
mysql> drop trigger tg1;                                      #删除触发器
mysql> start transaction;                                     #开启事务
mysql> insert into tab_name (name,age,post,salary) values
    -> ('诸葛亮',40,'业务员',11000);
mysql> insert into a1 values('魏延','否');
mysql> commit;                                                #提交事务,rollback;回滚
mysql> /*建表时设置为innodb引擎的才支持事务;
   /*>   start transaction;和commit;之间的sql语句作为整体执行
   /*>   若不执行事务,则执行rollback;语句进行回滚
   /*>   事务具有原子性、一致性、隔离性、持久性,简称ACID*/
mysql> alter table a1 add primary key(name);                  #设置主键
mysql> alter table a1 drop primary key;                       #删除主键

二、数据库交互 pymysql

import pymysql

sqlconn = pymysql.connect(host="localhost",port=3306,user ="root",passwd = "123456",db ="newbodb")
#创建数据库连接
sqlcursor = sqlconn.cursor()    #实例化数据库游标
effect_row = sqlcursor.execute("desc tab_name;")   #执行原生sql语句,并返回结果影响行数
effect_row1 = sqlcursor.execute("select * from tab_name;")
sqlconn.commit()                #作为事务提交后,对数据库的update/insert/delete操作才会生效
effect_data = sqlcursor.fetchall()    #获取查询结果fetchone()/fetchmany(n)
print(effect_data)
sqlcursor.close()
sqlconn.close()

三、数据库交互 SQLAlchemy

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

import sqlalchemy
from sqlalchemy import create_engine, Table, MetaData, Column, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker, mapper, relationship

#---------创建数据库表方式1--------
engine = create_engine("mysql+pymysql://root:123456@localhost/newbodb?charset=utf8",encoding='utf-8',each=True)
#创建数据库表引擎,ORM框架支持innodb,设置数据库显示信息each=True
Base = declarative_base()   #实例化ORM基类
class Equip(Base):
    __tablename__ = 'equip'                 # 创建数据库表名
    id = Column(Integer, primary_key=True)  #主键id
    name = Column(String(32))                #定义字段
    weapon = Column(String(64))
#   tab_id = Column(Integer,ForeignKey("tab_name.id"))  #设置外键

#   relation=relationship("Tab_name",backref="equip")   #设置外键关联关系

    def __repr__(self):                      #设置显示内容信息,否则显示为地址
        pass
        return self.name, self.weapon

# Base.metadata.create_all(engine)  # 创建表结构

#---------创建数据库表方式2--------
# equip = Table("equip",MetaData(),
#               Column("id",Integer,primary_key=True),
#               Column("name",String(32)),
#               Column("weapon",String(64))
#               )
# class Equip(object):
#     def __init__(self,name,weapon):
#         self.name = name
#         self.weapon = weapon
#
#     def __repr__(self):
#         pass
#         return self.name, self.weapon
# mapper(Equip,equip)

#---------数据库操作--------
session_class = sessionmaker(bind = engine)
session = session_class()
#增加表数据
equip_data = Equip(name="吕布",weapon="方天画戟")
session.add(equip_data)
#修改表数据
# equip_data = session.query(Equip).filter(Equip.name=="关羽").first()  #注意first()和all()方法的区别
# print(equip_data.id,equip_data.name,equip_data.weapon)
# equip_data.weapon = "青龙偃月刀"
#删除表数据
# equip_delete = session.query(Equip).filter(Equip.name == "诸葛亮").delete()
#查询表数据
# equip_data = session.query(Equip.id,Equip.name,Equip.weapon).filter(Equip.id > 2).all()
# print(equip_data)

session.commit()
# session.rollback()   #数据回滚

 

 

 

参考文章:

http://www.cnblogs.com/alex3714/articles/5978329.html

http://www.cnblogs.com/wupeiqi/articles/5713330.html

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值