数据库分类概述
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
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])
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)
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},....])
表达式操作符