Python学习笔记 访问数据库

时间:2022-12-28 23:35:43
十八:访问数据库                     1:使用SQLite                          SQLite 是一种嵌入式数据库,他的数据库就是一种文件,由于SQLite 本身是C写的 而且体积很小,所以被经常集成到各种应用程序中,甚至是iOS和Android的app中都有继承                         Python就内置了SQLite3 ,要操作关系数据库,首先需要链接到数据库 一个数据库的链接称之为connection 连接到数据库后,需要打开游标 称之为cursor 通过cursor执行SQL语句                             #导入SQLite驱动                             >>>import sqlite3                             #连接到SQLite数据库                             #数据库文件是test.db                             #如果文件不存在,会自动在当前目录中创建                             >>>conn=sqlite3.connect('test.db')                             #创建一个cursor                             >>>cursor=conn.cursor()                             #执行一条SQL语句 创建user表                             >>>cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')                             <sqlite3.Cursor object at 0x 38429342>                             #继续执行一条SQL语句 插入一条记录                             >>>cursor.execute('insert into user(id name) values(\'1\',\'lc\')')                               <sqlite3.Cursor object at 0x 384df29342>                             #通过rowcount获得插入的行数                             >>>cursor.rowcount                             1                            #关闭cursor                             >>>cursor.close()                             #提交事物                             >>>conn.commit()                             #关闭链接                             >>>conn.colse()                         试一试查询 ,查询可以如下:                             >>>conn=sqlite3.connect('test.db')                             >>>cursor=conn.cursor()                             #执行查询语句                             >>>cursor.execute('select * from user where id =?','1')                               <sqlite3.Cursor object at 0x 38429342>                             #获得查询结果                             >>>values=cursor.fetchall()                             >>>values                             [(u'1',u'lc')]                             >>>cursor.close()                             >>>conn.close()
                    2:使用mysql                             安装mysql 然后 修改配置文件                         [client]                         default-character-set=utf8                         [mysqld]                         default-storage-engine=INNODB                         character-set-server=utf8                         collation-server=utf8_general_ci                         修改完毕后 用mysql命令 查看 show variables like '%char%' 让所有的编码都为utf8
                        安装mysql的Python驱动                             $easy_install mysql-connector-python                             $easy_install MySQL-python                         前者是mysql官方的纯Python驱动 后者是封装了mysql C驱动的Python驱动
                        以mysql-connector-python 为例:                             #导入mysql驱动                             >>>import mysql.connector                             #建立连接                             >>>conn=mysql.connnector.connect(user='root',password='123456',database='pythonstudy',user_unicode=True)                             >>>cursor=conn.cursor()                             >>>cursor.execute('create table user(id varchar(20) primary key ,name varchar(20))')                             >>>cursor.execute('insert into user(id,name) values(%s,%s)',['1','lc'])                             >>>cursor.rowcount                             1                             >>>conn.commit()                             >>>corsor.close()                             >>>cursor=conn.cursor()                             >>>cursor.execute('select * from user where id =%s' ,'1')                             >>>values=cursor.fetchall()                             >>>values                             [(u'1',u'lc')]                             >>>cursor.close()                             >>>conn.close()                         注意 在Python中mysql的占位符是%s  通常我们在连接mysql的时候 传入use_unicode=True 让mysql的DB-API始终返回Unicode               
                3:使用SQLAlchemy                     数据库就是一个二维表,包含很多行很多列,把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行 list的每一个元素都是一个tuple 表示一行记录 如                     [('1','lc'),('2','xxb'),('3','xxw')]                     Python的DB-API返回的数据结构就是上面这样表示的                     但是tuple表示一行很难看出表的结构 如果把一个tuple用class实例表示就可以跟容易看出表的结构了 也就是ORM技术 把关系数据库的表结构映射到对象上                     在Python中最有名的ORM框架就是SQLAlchemy                      首先通过easy-install或者pip安装SQLAlchemy:                     $easy_install sqlalchemy                     然后利用mysql中的数据库中的user表 用SQLAlchemy 试一试:                     第一步:导入SQLAlchemy 并初始化DBSession                                              #导入:                         from sqlalchemy import Column,String,create_engine                         from sqlalchemy.orm import sessionmaker                         from sqlalchemy.ext.declarative import declarative_base                                          #创建对象的基类                         Base=declarative_basae()                         #定义User对象:                         class User(Base):                             #表的名字:                             __tablename__='user'                                                          #表的结构                             id=Column(String(20),primary_key=True)                             name=Column(String(20))
                        #初始化数据库连接                         engine=create_engine('mysql+mysqlconnector://root:123456@localhost:3306/pythonstudy')                         #创建DBSession                         DBSession=sessionmaker(bind=engine)                              以上代码完成了SQLAlchemy的初始化和具体的每个表达的class定义 如果有多个表 就继续定义其他的class                      create_engine()用来初始化数据库连接 SQLAlchemy 用一个字符串表示连接信息                     第二步:有了连接信息 就可以使用ORM对数据库进行操作:                         #创建session对象                         session=DBSession()                         new_user=User(id='5',name='lyd')                         #添加到session中                         session.add(new_user)                         #提交即保存到数据库                         session.commit()                         #关闭session                         session.close()
                    查询如下:                         session=DBSession()                         #创建query查询 filter是where条件 最后调用one()是返回唯一一行  如果调用all()则返回所有行                         user=session.query(User).filter(User.id=='5').one()                         #打印类型和对象的name 属性                         print 'type',type(user)                         print 'name',user.name                         #关闭链接                         session.close()
                    ORM 就是把数据库表的行与相应的对象建立关联互相转换。                     如果一个User拥有多个Book 就可以定义一对多关系如下:                         class User(Base):                             __tablename__='user'                                                          id=Column(String(20),primary_key=True)                             name=Column(String(20))                             #一对多:                             books=relationship('Book')                                      class Book(Base):                             __tablename__='book'                                      id=Column(String(20),primary_key=True)                             name=Column(String(20))                             #多的一方的book表是通过外键关联到user表的                             user_id=Column(String(20),ForeignKey('user','id'))
                    当我们查询一个user对象是 该对象的books属性将返回一个包含若干个book对象的list