zoukankan      html  css  js  c++  java
  • python数据库编程

    大纲

    数据库的基本操作

    函数属性&对象方法

    连接数据库

    一楼的ORM技术(sqlalchemy)

    数据库的基本操作

    创建数据库:

    CREATE DATABASE test;

    GRANT ALL ON test.* to user(s);

    第一行创建了一个名为“test”的数据库,假设你是数据库的管理员,第二行语句可以为指定用户(或所有用户)提升权限

    使用数据库

    USE test;

    如果你已经登录一个数据库系统,但是还没有选择你希望使用的数据库,这条简单的语句可以让你指定一个数据库,用来执行数据库操作。

    删除数据库

    DROP DATABASE test;

    这条简单的语句可以从数据库中移除所有表和数据,并将其从系统中删除。

    创建表

    CREATE TABLE users (login VARCHAR(8), userid INT, projid INT);

    这条语句创建一个新表,其中包含字符串列login,以及两个整型列:userid和projid。

    删除表

    DROP TABLE users;

    这条简单的语句可以删除数据库中的一个表,并清空其中的所有数据。

    插入行

    INSERT INTO users VALUES('leanna',2111,1);

    可以使用INSERT语句向数据库中插入一个新行。需要指定表名以及其中每列的值。对于本例而言,字符串“leanna”对应于login参数,而2111和1分别对应于userid和projid。

    更新行

    UPDATE users SET projid=4 WHERE projid=2;

    UPDATE users SET projid=1 WHERE userid=311;

    为了修改表中已存在的行,需要使用UPDATE语句。使用SET来确定要修改的列,并提供条件来确定修改的行。在第一个例子中,所有“projid”为2的用户需要改为4。而在第二个例子中,将指定用户(这里是userid为311的用户)移到编号为#1的项目组中。

    删除行

    DELETE FROM users WHERE projid=%d;

    DELETE FROM users;

    为了删除表中的行,需要使用DELETE FROM 命令,指定准备删除的行的表名以及可选的条件。如果没有这个条件,就会像第二个例子样,把所有行都删除了。

    以上就是数据库的一些基本的操作,从上我们可以看出:

    创建数据库(create)和删除数据库(drop),创建表和删除表也一样。

    修改表中已存在的行叫做更新(update)和往数据库里添加新行叫做插入(insert)

    而移出表中已存在的行叫做删除(delete)。

    这些动作通常称为数据库命令或操作。使用可选的条件请求数据库中的行称为询查(query)。

    函数属性&对象方法

    connect()函数属性

    user                     用户名
    password               密码
    host                     主机名
    database               数据库名  MySQLdb数据库使用的是db
    dsn                      数据源名
    connect()函数通过 Connection 对象访问数据库。兼容模块必须实现 connect()函数,该函数创建并返回一个 Connection 对象。
    

    应用与数据库之间进行通信需要建立数据库连接。它是最基本的机制,只有通过数据库连接才能把命令传递到服务器,并得到返回的结果。当一个连接(或一个连接池)建立后,可以创建一个游标,向数据库发送请求,然后从数据库中接收回应。

    Connection 对象方法
    Connection 对象不需要包含任何数据属性

    close()                                关闭数据库连接
    commit()                                提交当前事务
    rollback()                              取消当前事务
    cursor()                                使用该连接创建(并返回)一个游标或类游标的对象
    errorhandler(cxn,cur,errcls,errval)          作为给定连接的游标的处理程序                                
    

    当使用 close()时,这个连接将不能再使用,否则会进入到异常处理中。

    如果数据库不支持事务处理,或启用了自动提交功能,commit()方法都将无法使用。如果你愿意,可以实现单独的方法用来启动或关闭自动提交功能。

    处理的数据库而言,只需要在方法中实现“pass”即可。

    和 commit()相似,rollback()方法也只有在支持事务处理的数据库中才有用。发生异常之后,rollback()会将数据库的状态恢复到事务处理开始时。

    如果 RDBMS 不支持游标,那么 cursor()仍然会返回一个尽可能模仿真实游标的对象。这是最基本的要求。每个适配器开发者都可以为他的接口或数据库专门添加特殊属性。

    当你完成数据库连接并关闭游标时,需要对所有操作执行 commit(),并对你的连接执行close()。

    Cursor 对象

    arraysize                          使用fetchmany方法时,一次取出的结果行数,默认为1
    connection                         创建此游标的链接(可选)
    description                        返回游标活动状态(7选项元组):(name,type_code,display_size,internal_size,precision,scale,null_ok)
    lastrowid                          上次修改的行ID(可选:如果不支持行ID,则返回None)
    rowcount                           上次execute*()方法处理或影响的行数
    callproc(func[,args])              调用储存过程
    close()                              关闭游标
    execute(op[,args])                执行数据库查询或命令
    executemany(op,args)             类似execute()和map()的结合,为给定的所有参数准备执行的数据库查询或命令
    fetchone()                           获取查询结果的下一行
    fetchmany([size=cursor.arraysize])      获取查询结果的下面size行
    fetchall()                            获取查询结果的所有(剩余)行
    __iter__()                           为游标创建迭代器对象(可选,参考next())
    messages                            游标执行后从数据库中获取的消息列表(元组结合,可选)
    next()                                被迭代器用于获取查询结果的下一行(可选,类似fetchone(),参考__iter__())
    nextset()                             移动到下一个结果集合(如果支持)
    rownumber                            当前结果集中游标的索引(以行为单位,从0开始,可选)
    setinputsizes(sizes)               设置允许的最大输入大小(必须有,但是实现是可选的)
    setoutputsize(size[,col])         设置大列获取的最大缓冲区大小(必须有,但是实现是可选的)
    

    当建立连接后,就可以和数据库进行通信了。游标可以让用户提交数据库命令,并获得查询的结果行。

    当游标创建好后,就可以执行查询或命令(或多个查询和命令),并从结果集中取回一行或多行结果。

    游标对象最重要的属性是 execute*()和 fetch*()方法,所有针对数据库的服务请求都是通过它们执行的。arraysize 数据属性在为 fetchmany()设置默认大小时非常有用。当然,在不需要时关闭游标是个好主意,而如果你的数据库支持存储过程,可能会用到callproc()。

    类对象和构造函数

    Date (yr, mo, dy)                  日期值对象
    Time (hr, min, sec)                  时间值对象
    Timestamp (yr, mo, dy, hr, min, sec)         时间戳值对象
    DateFromTicks (ticks)                日期对象,给出从新纪元时间(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数
    TimeFromTicks (ticks)                时间对象,给出从新纪元时间(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数
    TimestampFromTicks (ticks)             时间戳对象,给出从新纪元时间(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数
    Binary (string)                   对应二进制(长)字符串对象
    STRING                       表示基于字符串列的对象,比如 VARCHAR
    BINARY                        表示(长)二进制列的对象,比如 RAW、BLOB
    NUMBER                       表示数值列的对象
    DATETIME                      表示日期/时间列的对象
    ROWID                       表示“行 ID”列的对象
    

    连接数据库

    以MySQL为例:

    打开cmd输入:pip3 install mysqlclient    安装mysql驱动
    
    >>> import MySQLdb as mysql         导入MySQL驱动重名为mysql
    >>> conn = mysql.connect('127.0.0.1','root','root')            连接数据库
    >>> conn = mysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='test', charset='utf8')        也可以使用关键字连接数据库
    >>> config = {
        'host': '127.0.0.1',
        'port': 3306,
        'user': 'root',
        'passwd': 'root',
        'db': 'test',
        'charset': 'utf8'
    }
    >>> conn = mysql.connect(**config)        也可以使用字典连接数据库
    >>> cur = conn.cursor()      创建cursor对象
    >>> cur.execute('create table users (id varchar(20) primary key, name varchar(20))')         创建users表
    >>> id = 1
    >>> name = "smelond"
    >>> cur.execute("insert into users values('%s','%s')" % (id,name))            插入一行记录,注意MySQL的占位符是%s
    >>> cur.execute("update users set id=2 where id=1")                      修改一行记录
    >>> cur.execute("select * from users")                    查询记录
    >>> values = cur.fetchall()                    将查询的记录赋给values
    >>> values                                         输出values
    (('2', 'smelond'),)
    >>> cur.execute("insert into users values(3,'admin')")                     再次添加记录
    >>> cur.execute("select * from users")
    >>> values = cur.fetchall()
    >>> values
    (('2', 'smelond'), ('3', 'admin'))
    
    >>> conn.commit()             提交
    >>> cur.close()              关闭cursor
    >>> conn.close()                关闭connection
    

     

    ORM技术(sqlalchemy)

    在Python中,最有名的ORM框架是SQLAlchemy

    安装SQLAlchemy

    pip3 install sqlalchemy
    
    # 导入模块
    from sqlalchemy import Column, String, create_engine, INT
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    
    # 创建对象的基类:
    Base = declarative_base()
    
    
    # 定义User对象
    class User(Base):
        __tablename__ = "users"
    
        # 表的结构
        id = Column(INT, primary_key=True)
        name = Column(String(20))
    
    
    # 初始化数据库连接
    # create_engine()用来初始化数据库连接。SQLAlchemy用一个字符串表示连接信息
    engine = create_engine("mysql://root:root@127.0.0.1:3306/test")
    # 创建DBSession类型
    DBSession = sessionmaker(bind=engine)
    

    向数据库表中添加一行记录。
    由于有了ORM,我们向数据库表中添加一行记录,可以视为添加一个User对象:

    # 创建session对象
    session = DBSession()
    # 创建新User对象
    new_user = User(name='smelond')  # 由于我在数据库里面设置id为主键,并且自动增长,所以这个地方可以不带id。
    # 添加到session
    session.add(new_user)
    # 提交即保存到数据库
    session.commit()
    # 关闭session
    session.close()
    

    关键是获取session,然后把对象添加到session,最后提交并关闭。DBSession对象可视为当前数据库连接。

    查询记录:

    # 创建session对象
    session = DBSession()
    # 创建Query查询,filter是where条件,最后调用one()返回唯一行,如果条用all()则返回所有行:
    result = session.query(User).filter(User.name == 'smelond').one()
    print("type:", type(result))
    print("name:", result.name)
    session.close()
    
    
    结果:
    type: <class '__main__.User'>
    name: smelond
    

     从上面我们可以看出“还是ORM比较好用”。

    作者:smelond
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    一些基本的操作,编译,构建,单元测试,安装,网站生成和基于Maven部署项目。
    Maven目标
    Maven是什么?
    Maven的生命周期是为了对所有的构建过程进行了抽象了,便于统一。
    mvn archetype:generate 创建Maven项目
    Maven是一个项目管理工具
    Maven项目对象模型(POM)
    e816. 创建工具栏
    e836. 设置JTabbedPane中卡片的提示语
    e834. 设置JTabbedPane中卡片的位置
  • 原文地址:https://www.cnblogs.com/smelond/p/8526546.html
Copyright © 2011-2022 走看看