数据库分类概述

  SQL

    mysql\oracle\sql server\db2..

  NoSQL

    mongodb\neo4j\hbase..

  区别:

    cap

    对数据丢失容忍度

开发环境介绍

  mysql

  navicat

开发包

  mysql-connector

    - http://dev.mysql.com/downloads/connector/python

  MYSQLdb

    - https://pypi.python.org/pypi/MySQL-python

    pip install mysql-connector

  SQLAlchemy

    - http://www.sqlalchemy.org

代码模式:

  创建连接:connect

  创建游标:cursor

  执行sql:excute、executemany

      一次提交一条sql语句

           一次提交多条sql语句

  关闭连接:close

  参数化SQL:%s

python pymysql 多个查询 python 查询数据库表_User

python pymysql 多个查询 python 查询数据库表_User_02

1 # !/usr/bin/python
 2 # encoding:utf8
 3 
 4 
 5 #导入连接包
 6 from mysql import connector
 7 #建立连接
 8 params=dict(host='localhost',port='3306',user='root',password='',database='test')
 9 conn =connector.connect(**params)
10 #创建游标
11 curs=conn.cursor()
12 # DDL语句,创建表、视图、索引
13 # ddl="""
14 #     create table users(id integer,name varchar(40),address varchar(100))
15 # """
16 # try:
17 #     curs.execute(ddl)
18 # except Exception,e:
19 #     print '异常+&s'%e
20 # DML语句,增删查改
21 # 参数化
22 # 参数化sql插入语句
23 mysqlinsert="""
24     insert into users(name,address) values(%s,%s)
25 """
26 #参数
27 u1=('huang','zizhou')
28 #传参,使用游标名进行操作
29 curs.execute(mysqlinsert,u1)
30 #提交事物,保证持久性,不会回滚。使用连接名进行操作
31 conn.commit()
32 #批量参数
33 us=[
34     ('huang1','zizhou12'),
35     ('huang2','zizhou11'),
36     ('huang3','zizhou10'),
37     ('huang4','zizhou9'),
38     ('huang5','zizhou8'),
39     ('huang6','zizhou7'),
40     ('huang7','zizhou6'),
41     ('huang8','zizhou5'),
42     ('huang9','zizhou4'),
43     ('huang10','zizhou3'),
44     ('huang11','zizhou2'),
45     ('huang12','zizhou1'),
46 ]
47 #提交批量
48 curs.executemany(mysqlinsert,us)
49 conn.commit()
50 # 查询语句
51 mysqlselect="""
52     select*from users
53 """
54 #执行查询语句后不需要进行commit
55 curs.execute(mysqlselect)
56 #遍历结果
57 for row in curs:
58     print  row
59 # 关闭连接,使用链接名进行操作
60 conn.close()

View Code

直接用sql语句操作数据库

通过ORM方式操作数据库

  SQLAlchemy:the python sql toolkit and object relational mapper

    - http://www.sqlalchemy.org

    pip install SQLAlchemy 

ORM:object relational mapper

  表映射到类

  行映射到对象

  列映射到属性

 

程序的分层架构:

  三层、4层、多层

  表示层、业务逻辑层、持久化层、数据库层

  表示层、业务逻辑层、数据库层

分层的特点:

  伸缩性、重用、维护

sqlalchemy的有点

隐藏数据库实现,业务代码操作对象而不是数据库

开发效率高,无需编写sql代码就可完成数据库操作

良好的数据库操作接口、简单、学习成本低

动态数据表映射

 

缺点:不容易做数据库查询优化,可能带来性能上的损失

 

开发步骤:

  创建连接

  创建映射

  初始化映射实例

  创建会话

  持久化对象实例  增删改查

创建连接

  engine=create_engine(数据库连接串,echo=True)

    #echo=True,表示打印orm中的sql执行情况

定义映射

  声明基类:

    Base=declarative_base()

  声明队形和实体映射类,继承基类

    class User(Base):

  创建表

    Base.metadata.create_all(engine)

  创建会话

    Session=sessionmaker(bind=engine)

    session=Session()

  会话方法

    session.add()/add_all()

    session.delete()

    session.commit()

    session.query()

      filter()/filter_by()

      order_by()

      first()

      all()

      切片操作([1,4])

 

python pymysql 多个查询 python 查询数据库表_User

python pymysql 多个查询 python 查询数据库表_User_02

1 # !/usr/bin/python
 2 # encoding:utf8
 3 
 4 
 5 from sqlalchemy import create_engine
 6 from sqlalchemy.ext.declarative import declarative_base
 7 from sqlalchemy import Column,Integer,String,DateTime,ForeignKey
 8 from sqlalchemy.orm import sessionmaker,relationship,backref
 9 
10 # 1、创建连接
11 engine=create_engine('mysql+mysqlconnector://root:@127.0.0.1:3306/test?charset=utf8',echo=True)
12 
13 # 2、定义映射
14 Base=declarative_base()
15 
16 class User(Base):
17     __tablename__='users'
18     id=Column(Integer,primary_key=True)
19     name=Column(String(40))
20     address=Column(String(100))
21 
22     def __str__(self):
23         return "User(id={0},name={1},address={2})".format(self.id,self.name,self.address)
24 
25 # 3、映射实例化,创建数据库表
26 Base.metadata.create_all(engine)
27 
28 # 4、创建会话
29 Session=sessionmaker(engine)
30 session=Session()
31 # 5、操作数据
32 u1=User(name='zhangsan',address='beijing')
33 session.add(u1)
34 session.commit()
35 print u1.id
36 
37 us=[
38     ('huang1','zizhou12'),
39     ('huang2','zizhou11'),
40     ('huang3','zizhou10'),
41     ('huang4','zizhou9'),
42     ('huang5','zizhou8'),
43     ('huang6','zizhou7'),
44     ('huang7','zizhou6'),
45     ('huang8','zizhou5'),
46     ('huang9','zizhou4'),
47     ('huang10','zizhou3'),
48     ('huang11','zizhou2'),
49     ('huang12','zizhou1'),
50 ]
51 for u in us:
52     u2=User(name=u[0],address=u[1])
53     session.add(u2)
54 session.commit()
55 
56 uc=session.query(User).filter(User.name.like('h%')).all()
57 for uc1 in uc:
58     print uc1
59 uc2=session.query(User).filter(User.name=='zhangsan').all()
60 # uc2=session.query(User).filter(User.name=='zhangsan').first()
61 for uc21 in uc2:
62     print uc21
63     uc21.address = 'jiangnan'
64     print uc21
65 
66 
67 session.commit()
68 for uc21 in uc2:
69     session.delete(uc21)
70 session.commit()

View Code

 MongoDB

https://www.mongodb.org/dl/win32

www.mongodb.com

www.mongovue.com

https://pypi.python.org/pypi/pymongo

  pip install pymongo

启动:

  安装版:bin目录下,已存在文件夹,执行:mongod --dbpath 具体的path,不需要指定端口

  mongod --port27017 --dbpath ./data --logpath ./log/mongod.log -logappend

    .\bin\mongod --dbpath .\data --logpath .\log\mongod.log -logappend

    mongod –storageEngine mmapv1 –dbpath XXXXX

    貌似有时候不需要指定端口

  在浏览器下打开:http://localhost:27017/

常见操作

  bin目录下

  mongo

  db

  use yourdb

  show dbs

  show collections

  db.collection.insert()
    db.zhangdb.users.insert({'name':'zhang','sex':'m'})

  db.collection.find()

  db.collection.remove()

    删除
    db.zhangdb.users.remove({'name':'zhang'})

  db.collection.update()

    db.users.update({'name':'zhang'},{$set{'age':20}})
  db.collection.drop()

pymongo

  insert_one(doc)

  insert_many(doc,ordered=True、False)  False并行插入数据库,中间存在错误后面的插入动作也可继续进行。True串行操作,如果中间出现失败情况,后续的不会在进行插入了。

  软事物:文档基本保障事物完整性,文档由key-value对存在。

查询

  find(filter)

更新操作

  update_one(filter,update,upsert=True/False)

  update_many(filter,update,upsert=True/False)

 替换操作

  replace_one(filter,replacement,upsert=True/False)

删除

  remove(filter)

  delete_one(filter)

  delete_many(filter)

python pymysql 多个查询 python 查询数据库表_User

python pymysql 多个查询 python 查询数据库表_User_02

1 # !/usr/bin/python
  2 # encoding:utf8
  3 
  4 """
  5 @author:hj
  6 @contact:huangjie01@fangdd.com
  7 @file: pymongotest.py
  8 @time: 2017/2/23 11:46
  9 """
 10 import pymongo
 11 from pymongo import MongoClient
 12 conn=MongoClient('localhost')
 13 db=conn.testerdb
 14 users=db.app.users
 15 #插入
 16 # u1={
 17 #     'name':'zhang',
 18 #     'mails':["s@s", 'fkk@dgdfg.com']
 19 # }
 20 # x=users.insert_one(u1)
 21 # print dir(x)
 22 # print x.inserted_id
 23 #
 24 # props=['name','mails']
 25 # us=[
 26 #     ['zhao',['abc@we','sdfsld@kdfsd']],
 27 #     ['zhao',['abc@we','sdfsld@kdfsd']],
 28 #     ['zhao',['abc@we','sdfsld@kdfsd']],
 29 #     ['zhao',['abc@we','sdfsld@kdfsd']],
 30 #     ['zhao',['abc@we','sdfsld@kdfsd']],
 31 #     ['zhao',['abc@we','sdfsld@kdfsd']],
 32 #     ['zhao',['abc@we','sdfsld@kdfsd']],
 33 #     ['zhao',['abc@we','sdfsld@kdfsd']]
 34 # ]
 35 # ul=[dict(zip(props,u))for u in us]
 36 # print ul
 37 # users.insert_many(ul,ordered=False)
 38 #
 39 # # 查询
 40 # import json
 41 # # json和bson中间的转换
 42 # from bson import json_util
 43 # #全局扫描
 44 # cursor=users.find()
 45 # #等值扫描
 46 # cursor=users.find({'name':'zhang'})
 47 # #in
 48 # cursor=users.find({'name':{'$in':{'zhang','li'}}})
 49 # #大于
 50 # cursor=users.find({'age':{'$gt':25}})
 51 # # and
 52 # cursor=users.find({'name':{'$in':['zhang','li']},
 53 #                    'age':{'$gt':25}
 54 #                    }
 55 #                   )
 56 # cursor=users.find({'name':{'$in':['zhang','li']},
 57 #                    'mails':{'$size':2}
 58 #                    }
 59 #                   )
 60 # # or
 61 # cursor=users.find({'$or':[{'name':{'$in':['zhang','li']}},
 62 #                           {'age':{'$gt':25}
 63 #                            }
 64 #                           ]
 65 #                    }
 66 #                   )
 67 # for user in cursor:
 68 #     print user
 69 #     print json.dumps(user,indent=4,default=json_util.default)
 70 ##  更新
 71 ## 新增
 72 # users.update_many(
 73 #     {},
 74 #     {'$set':{"age":28}}
 75 #     # {'$unset': {"age": 28}}
 76 # )
 77 ## 所有加2
 78 # users.update_many(
 79 #     {},
 80 #     {'$inc':{"age":2}}
 81 # )
 82 # #更新指定的数据,age和20比较去叫小的
 83 # users.update_many(
 84 #     {'name':
 85 #          {'$in':['zhang','li']}
 86 #      },
 87 #     {'$min':
 88 #          {'age':20}
 89 #     }
 90 # )
 91 users.update_many(
 92     {'name':
 93          {'$in':['zhang','li']}
 94      },
 95     {'$currentDate':
 96          {'create_time':True,
 97           # 自然日
 98           'mod_time':{'$type':'timestamp'}
 99           #时间戳
100           }
101     }
102 )

View Code

 

集合操作

  等价于关系数据库的分组汇总统计,比如分组、最大值、最小值

  如同linux管道:cat a.txt|wc -l

  管道操作符

    collection.aggregate([{stage1},{stag1},....])

  表达式操作符