python 是如何访问数据库的,通过数据库接口 DB-API,他是阐明一系列所需对象和数据库访问机制的标准,它可以为不同的数据库适配器和底层数据库系统提供一致性的访问。
为实现对数据库的访问,python 开发了许多用于连接数据库的适配器。
以 mysql 为例,python3 中可以使用 mysql-connector-python 以及 pymysql。
与数据库交互的方式有两种,一种是简单直接的原始 sql 语句,另一种就是 ORM(假如你更愿意操作 python 对象的话,这是更好的选择)
- import适配器
- connect 方法连接数据库,返回connect对象
- 生成该connect的游标对象
- cur = connect.cursor()
- 调用方法进行数据库增删改查
- callpro execute 常用
- 关闭连接
sqallchemy 是比较流行的 pytho ORM,支持 python3+,安装方式也很简单。最好的教程([http://docs.sqlalchemy.org/en/latest/orm/tutorial.html])
我力求用最简单的语言来说一下它的基本用法。
orm 就是建立数据库的映射对象。通过 sqlalchemy 的内置 declarative_base 方法,完成与数据库表的映射。
- import sqlalchemy
- from sqlalchemy import create_engine
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy importString,Integer,Column
- from sqlalchemy importForeignKey
- from sqlalchemy.orm import relationship,sessionmaker
- #首先连接数据库,echo=True,让你在命令窗口执行的时候,可以查看生成的原生SQL的样子
- engine = create_engine('mysql+mysqlconnector://user:psw@ip/dbname',echo=True)
- Base= declarative_base()
- #继承Base,将users表映射为User对象
- classUser(Base):
- __tablename__ ='users'
- id =Column(Integer, primary_key=True, nullable=True)
- name =Column(String(20))
- newpassword =Column(String(20))
- getpassword =Column(String(20))
- addresses = relationship("Address", back_populates="user")#与Address建立relationship
- def __repr__(self):#命令窗口调试用
- return"<User(name='%s', id='%s')>"%(
- self.name,self.id)
- classAddress(Base):
- __tablename__ ='address'
- id =Column(Integer, primary_key=True, nullable=True)
- email_address =Column(String(50))
- userid =Column(Integer,ForeignKey('test.id'))#建立外键
- user = relationship("User", back_populates="addresses")
- def __repr__(self):
- return"<Address(email_address='%s')>"%self.email_address
- jack =User(name='ttt',newpassword='123',getpassword='123')
- jack.addresses=[Address(email_address='111111'),Address(email_address='222222')]
- Session= sessionmaker(bind=engine)#建立session . The ORM's "handle" to the database is the Session
- session =Session()
- session.add(jack)#添加对象
- session.commit()#提交之前数据库是不会发生变化的。需要flush
- jack = session.query(User).filter_by(name='ttt').one()#查询
- session.query(User).join(Address)#交叉查询 join 深入了解可以去看那篇文章
- print(jack)
- print(jack.addresses)
- #如何使用存储过程
- #创建存储过程小细节,在用命令行时,利用delimiter $来更改默认;结束执行
- #Calling Stored Procedures
- connection = engine.raw_connection()#获取原生连接
- try:
- cursor = connection.cursor()
- #无参数
- cursor.callproc('find_test')
- for i in cursor.stored_results():#结果都存在stored_results()函数中
- print(i.fetchall())
- cursor.close()
- cursor = connection.cursor()
- # 有参数
- args=['guhongye',0]#输出参数可以用0来占位
- result = cursor.callproc('find_test1',args=args)
- print(result[1])
- cursor.close()
- finally:
- connection.close()
alembic 简明教程,下面这篇文章讲的很详细
http://huangx.in/18/alembic-simple-tutorial
- 1.alembic init YOUR_ALEMBIC_DIR
- 2.alembic revision -m "create account table"
- #自动更新 env.py 17行做如下修改
- import os
- import sys
- root = os.path.dirname(__file__)+'/../'# 定位到project根目录
- sys.path.append(root)
- from learnsqlalchemy importBase
- target_metadata =Base.metadata
- #可按下面执行
- alembic revision --autogenerate -m "create account table"
- 3.alembic upgrade head
- 4.alembic downgrade 版本号
来源: http://www.jianshu.com/p/b48c9eae2e9f