python是如何访问数据库的,通过数据库接口DB-API,他是阐明一系列所需对象和数据库访问机制的标准,它可以为不同的数据库适配器和底层数据库系统提供一致性的访问。
为实现对数据库的访问,python开发了许多用于连接数据库的适配器。
以mysql为例,python3中可以使用 mysql-connector-python 以及 pymysql。
与数据库交互的方式有两种,一种是简单直接的原始sql语句,另一种就是ORM(假如你更愿意操作python对象的话,这是更好的选择)
1、原生sql
import 适配器
connect 方法连接数据库,返回connect对象
生成该connect的游标对象
cur = connect.cursor()
调用方法进行数据库增删改查
callpro execute 常用
关闭连接
2、ORM
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 import String, Integer, Column
from sqlalchemy import ForeignKey
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对象
class User(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)
class Address(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()
3、alembic
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 import Base
target_metadata = Base.metadata
#可按下面执行
alembic revision --autogenerate -m "create account table"
3.alembic upgrade head
4.alembic downgrade 版本号