python操作数据库基础
数据库分类概述
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()
直接用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()
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 )
集合操作
等价于关系数据库的分组汇总统计,比如分组、最大值、最小值
如同linux管道:cat a.txt|wc -l
管道操作符
collection.aggregate([{stage1},{stag1},....])
表达式操作符

浙公网安备 33010602011771号