Python学习笔记 访问数据库

来源:互联网 发布:化妆品成分知多少 编辑:程序博客网 时间:2024/05/01 22:06
十八:访问数据库
                    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
0 0
原创粉丝点击