python操作数据库基础知识

96
Wantobetter
2018.01.03 17:54 字数 305

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 版本号
初识Python
Web note ad 1