精华内容
下载资源
问答
  • 准备:今天拿笔记本装了mysql,这样就能在不同地方其他电脑远程访问同一个数据库了。21.1 介绍本章的主题是如何在大型项目中使用关系型数据库。本章对数据库知识和SQL语言不介绍,本章从一个Python应用程序开始...

    准备:今天拿笔记本装了mysql,这样就能在不同地方用其他电脑远程访问同一个数据库了。

    21.1 介绍

    本章的主题是如何在大型项目中使用关系型数据库。本章对数据库知识和SQL语言不做介绍,本章从一个Python应用程序开始,了解在Python框架下,如何将数据保存到数据库,如何将数据从数据库中取出来。“在Python世界里,无需怀疑,与数据库协同工作已经几乎是所有应用程序的核心部分了。”作者原话。

    所有Python接口程序都一定程度上遵守Python DB-API 规范。

    21.2 Python数据库应用程序

    什么是DB-API?DB-API是一个规范。它定义了一系列必须的对象和数据库存取方式,以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。

    下面是一个例子:

    #-*- coding:utf-8 -*-

    importMySQLdb as SQL#首先需要与数据库连接

    cxn = SQL.connect(host='192.168.1.105', #这里是自己数据库主机地址

    user='xxx', #用户名

    passwd='xxxx', #密码

    db='JiaoYanShi', #所用数据库名称

    port=3306, #mysql默认端口

    charset='utf8') #编码方式#连接好以后与数据库进行交互需要创建游标对象,一个游标允许用户执行数据库命令和得到查询结果。

    cur =cxn.cursor()#创建一个表

    cur.execute('CREATE TABLE IF NOT EXISTS users(login VARCHAR(8),uid INT)')#插入数据

    cur.execute("INSERT INTO users VALUES('john',7000)")

    cur.execute("INSERT INTO users VALUES('jane',7001)")

    cur.execute("INSERT INTO users VALUES('bob',7200)")#执行execute以后数据已经进入了数据库,但是如果没有下面的事务提交语句,已经进入的数据就会回滚,导致数据库中不会有数据#python 操作mysql 是用 事物 的方式来实现的,所以必须有commit 提交的过程,否则数据表不会生效#然而commit原理还没怎么懂…这样commit()不知道是否妥当,后续继续研究cxn.commit()#必须进行select以后才会有打印结果

    cur.execute("SELECT * FROM users")

    content=cur.fetchall()for data incontent:printdataprint '-'*50

    #下面进行表的更新

    cur.execute("UPDATE users SET uid = 7100 WHERE uid = 7001")

    cxn.commit()

    cur.execute("SELECT * FROM users")

    content=cur.fetchall()for data incontent:printdataprint '-'*50#下面进行表数据删除cur.execute("DELETE FROM users WHERE login = 'bob'")

    cxn.commit()

    cur.execute("SELECT * FROM users")

    content=cur.fetchall()for data incontent:printdata#关闭游标对象

    cur.close()#关闭连接

    cxn.close()>>>(u'john', 7000L)

    (u'jane', 7001L)

    (u'bob', 7200L)--------------------------------------------------(u'john', 7000L)

    (u'jane', 7100L)

    (u'bob', 7200L)--------------------------------------------------(u'john', 7000L)

    (u'jane', 7100L)

    [Finishedin 0.3s]

    下面的这个例子展示了数据库数据通讯的一般框架:

    #-*- coding:utf-8 -*-

    importosfrom random importrandrange as rrange

    COLSIZ= 10RDBMSs= {'s': 'sqlite', 'm': 'mysql', 'g': 'gadfly'}

    DB_EXC=None

    HOST='xxx.xxx.xxx.xxx' #这里是HOST地址

    User='xxxx' #用户名

    Passwd='xxxxxx' #密码

    Port=3306 #mysql默认端口

    Charset='utf8' #编码方式

    #下面这个函数是选择数据库类型

    defsetup():return RDBMSs[raw_input('''Choose a database system:

    (M)ySQL

    (G)adfly

    (S)QLite

    Enter choice:''').strip().lower()[0]]#下面是返回一个database.connect连接对象

    defconnect(db, dbName):globalDB_EXC

    dbDir= '%s_%s' %(db, dbName)if db == 'sqlite':try:importsqlite3exceptImportError, e:try:from pysqlite2 importdbapi2 as sqlite3exceptImportError, e:returnNone

    DB_EXC=sqlite3if notos.path.isdir(dbDir):

    os.mkdir(dbDir)

    cxn=sqlite3.connect(os.path.join(dbDir, dbName))elif db == 'mysql':try:importMySQLdb#下面这个模块是专门用来进行数据库错误处理的

    import_mysql_exceptions as DB_EXCexceptImportError, e:returnNone#下面的处理时用来创建数据库(如果不存在),可以作为一个标准处理流程

    try:

    cxn= MySQLdb.connect(host =HOST,

    user=User,

    passwd=Passwd,

    db=dbName,

    port=Port,

    charset='utf8')#连接不成功进行如下处理

    exceptDB_EXC.OperationalError, e:#先连接一下数据库地址,不写数据库名称

    cxn = MySQLdb.connect(host =HOST,

    user=User,

    passwd=Passwd,

    port=Port,

    charset='utf8')try:

    cxn.query('DROP DATABASE %s' %dbName)exceptDB_EXC.OperationalError, e:pass

    #创建数据库

    cxn.query('CREATE DATABASE %s' %dbName)

    cxn.commit()

    cxn.close()#连接上数据库

    cxn = MySQLdb.connect(host =HOST,

    user=User,

    passwd=Passwd,

    db=dbName,

    port=Port,

    charset='utf8')elif db == 'gadfly':try:from gadfly importgadfly

    DB_EXC=gadflyexceptImportError, e:returnNonetry:

    cxn=gadfly(dbName, dbDir)exceptIOError, e:

    cxn=gadfly()if notos.path.isdir(dbDir):

    os.mkdir(dbDir)

    cxn.startup(dbName, dbDir)else:returnNonereturncxn

    drop= lambda cur: cur.execute('DROP TABLE users')defcreate(cur):#创建新的表users

    try:

    cur.execute('''CREATE TABLE users (

    login VARCHAR(8),

    uid INTEGER,

    prid INTEGER)''')exceptDB_EXC.OperationalError, e:

    drop(cur)

    create(cur)#插入的数据

    NAMES =(

    ('aaron', 8312), ('angela', 7603), ('dave', 7306),

    ('davina',7902), ('elliot', 7911), ('ernie', 7410),

    ('jess', 7912), ('jim', 7512), ('larry', 7311),

    ('leslie', 7808), ('melissa', 8602), ('pat', 7711),

    ('serena', 7003), ('stan', 7607), ('faye', 6812),

    ('amy', 7209),

    )#下面是一个创建函数,当调用此函数时,得到一个生成器

    defrandName():

    pick=list(NAMES)while len(pick) >0:yieldpick.pop(rrange(len(pick)))#下面的函数进行数据库中表users的写入操作

    definsert(cur, db):if db == 'sqlite':

    cur.executemany("INSERT INTO users VALUES(?, ?, ?)",

    [(who, uid, rrange(1,5)) for who, uid inrandName()])elif db == 'gadfly':for who, uid inrandName():

    cur.execute("INSERT INTO users VALUES(?, ?, ?)",

    (who, uid, rrange(1,5)))#下面将NAMES写进数据库

    elif db == 'mysql':

    cur.executemany("INSERT INTO users VALUES(%s, %s, %s)",

    [(who, uid, rrange(1,5)) for who, uid inrandName()])#cur.rowcount用来记录最后一次execute影响的行数

    getRC = lambda cur: cur.rowcount if hasattr(cur, 'rowcount') else -1

    #下面执行数据更新

    defupdate(cur):

    fr= rrange(1,5)

    to= rrange(1,5)

    cur.execute("UPDATE users SET prid=%d WHERE prid=%d" %(to, fr))returnfr, to, getRC(cur)#随机删除一些行

    defdelete(cur):

    rm= rrange(1,5)

    cur.execute('DELETE FROM users WHERE prid=%d' %rm)returnrm, getRC(cur)defdbDump(cur):

    cur.execute('SELECT * FROM users')print '\n%s%s%s' % ('LOGIN'.ljust(COLSIZ),'USERID'.ljust(COLSIZ), 'PROJ#'.ljust(COLSIZ))for data incur.fetchall():print '%s%s%s' % tuple([str(s).title().ljust(COLSIZ) for s indata])defmain():

    db=setup()print '*** Connecting to %r database' %db

    cxn= connect(db, 'test')if notcxn:print '\nERROR: %r not supported, exiting' %dbreturn

    #游标对象

    cur =cxn.cursor()print '\n*** Creating users table'create(cur)print '\n*** Inserting names into table'insert(cur, db)

    dbDump(cur)print '\n*** Randomly moving folks',

    fr, to, num=update(cur)print 'from one group (%d) to another (%d)' %(fr, to)print '\t(%d users moved)' %num

    dbDump(cur)print '\n*** Randomly choosing group',

    rm, num=delete(cur)print '(%d) to delete' %rmprint '\t(%d users removed)' %num

    dbDump(cur)print '\n*** Dropping users table'drop(cur)

    cur.close()

    cxn.commit()

    cxn.close()if __name__ == '__main__':

    main()

    上面的例子只是应用了MySQL数据库,其他两个没试验。

    21.3 对象-关系管理器(ORM)

    ORM即对象-映射关系(OBJECT/RELATION MAPPING),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。也就是将Python对象与SQL进行映射转换。

    如果用ORM,那么需要尽量避免直接的SQL查询。数据库中的表被转换为Python类,它具有列属性和操作数据库的方法。

    最知名的Python ORM模块是SQLAlchemy 和 SQLObject。书上说两者有着不同的设计哲学...

    1、SQLAlchemy的接口在某种程度上更接近SQL。SQLAlchemy的抽象层‘相当完美’,并且在必须用SQL完成某些功能时,它提供了足够的灵活性。‘其实这两个ORM模块在设置及存取数据时使用的术语非常相似,代码长度也相似。’

    这部分课本上的代码过时了。。

    展开全文
  • 现在在该课程里的作业,自己的笔记本配置不高,所以想问问有没有什么方法使得 在训练分类器时,怎么使自己的训练集和测试集变小。cifar10太大了。。。(cifar10 可以变小一点嘛?)
  • commons-dbcp数据库连接池技术

    千次阅读 2012-08-09 17:16:36
    本人在自己的笔记本实验的结果如下:   每秒中,可以向MySQL中插入纪录4000条.而创建一个连接则需要200毫秒左右的时间.使用了连接池技术以后,创建连接几乎不用任何时间,System.currentTimeMillis()打印时间...
    工作中,遇到了应用程序需要数据库连接池.这无疑是对程序性能的一个挑战.为什么使用数据库连接池呢?因为每次新建个连接,非常耗费资源.本人在自己的笔记本上做实验的结果如下: 
        每秒中,可以向MySQL中插入纪录4000条.而创建一个连接则需要200毫秒左右的时间.使用了连接池技术以后,创建连接几乎不用任何时间,用System.currentTimeMillis()打印时间差,为0毫秒.可见在大量并发访问的情况下,系统的性能通过连接池得到了飞跃. 
        因此搜索了好多开源框架,找到了DBCP.Tomcat的数据源技术,也是基于DBCP实现的.DBCP数据库连接池使用的方式很多,动态设置,配制文件(xml,properties).下面是示例代码.以及相关的驱动包我也给出来了.有兴趣的朋友们可以去试验一下.^-^ 
    数据库连接字符串例子 
    String url="jdbc:sqlserver://localhost:1433;database=数据库名;user=用户名;password=密码"; 
    其中,connection有多个构造方法,可以根据自己的需要调整连接字符串是否有用户名和密码. 
    commons项目地址:http://commons.apache.org/ 


    commons-dbcp-1.4.jar   commons-pool-1.5.4.jar  mysql-connector-java-5.1.12-bin.jar 

    Java代码  收藏代码
    1. import java.sql.SQLException;  
    2. import javax.sql.DataSource;  
    3. import org.apache.commons.dbcp.BasicDataSource;  
    4.   
    5. public class TestDBCP {  
    6.   
    7.     public static void main(String[] args) throws SQLException {  
    8.         BasicDataSource ds = new BasicDataSource();  
    9.         // 基本参数  
    10.         ds.setDriverClassName("com.mysql.jdbc.Driver");  
    11.         ds.setUsername("root");  
    12.         ds.setPassword("147258369");  
    13.         ds.setUrl("jdbc:mysql://192.168.0.34:3306/cold");  
    14.         // 池属性  
    15.         ds.setInitialSize(5);// 初始化连接池时,创建连接个数  
    16.         ds.setMinIdle(10);// 最小空闲连接数  
    17.         ds.setMaxIdle(100);// 最大空闲连接数  
    18.         ds.setMaxActive(100);// 连接池最大并发容量  
    19.   
    20.         // 可选测试参数,数据连接检测使用,网上常说的BUG,就是因为没设置下面属性引起的CONNECTION失效.  
    21.         ds.setValidationQuery("select count(*) from dual");  
    22.         ds.setTestOnBorrow(true);  
    23.         ds.setTestOnReturn(true);  
    24.         ds.setTestWhileIdle(true);  
    25.         // 大于0 ,进行连接空闲时间判断,或为0,对空闲的连接不进行验证  
    26.         ds.setMinEvictableIdleTimeMillis(1 * 60 * 1000);  
    27.         // 失效检查线程运行时间间隔,如果小于等于0,不会启动检查线程  
    28.         ds.setTimeBetweenEvictionRunsMillis(5 * 60 * 1000);  
    29.   
    30.         DataSource ds2 = (DataSource) ds;  
    31.         System.out.println(ds2.getConnection());  
    32.   
    33.     }  
    34.   
    35. }  
    展开全文
  • 很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要...只需要mysql在本机笔记本搭建一个普通的环境就行。那么首先是针对mysql一些普通常见的优化,比如分表分区、建索引、表字段设计以及my...

    很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧。

    如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据库软件设计复杂的集群关系,也不需要分布式水平分割等太重的优化。

    只需要用mysql在本机笔记本搭建一个普通的环境就行。

    那么首先是针对mysql做一些普通常见的优化,比如分表分区、建索引、表字段设计以及mysql的配置优化,比如缓冲区大小等等,这类配置我找了一个文章,详细的可以看 http://www.cnblogs.com/Bozh/archive/2013/01/22/2871545.html

    。其实mysql水平分表也是数据水平分割的做法。只需要在入库时针对不同的数据库入到不同的表即可,对于比较大的单个库,比如上两亿的单库,这时候就可以把它进行分表放到两个或者三个表,我的做法是单表不超过一亿。

    除了这些优化,我优化的核心设计思想是在建立索引和查询代码上面。

    很多人在设计社工库的时候,都是把所有要查询的字段都建立索引,而对于数据库来说,查询的数据库数据量越小,那么查询速度越快,另外索引也比较占空间,所以我们在索引上面做做动作,可以节省大量硬盘空间和优化查询速度。

    我的做法是只查可能有我想要的数据的表,肯定没有我想要的数据表直接不查询,我不需要查询的字段就不需要建索引,那这样就可以实现一来我查询的量小了,而来少给很多字段建立索引。

    举个简单的例子,比如你现有的数据库info中两个表:

    1A表和B表。AB表字段一样。AB表都有明文password字段不为空。

    2.A表username字段不为空,B表username字段为空。

    3.B表email字段不为空,A表email字段为空。

    那在这种情况下,就可以针对这两个表做如下的设计:

    1.A表和B表password字段都建立索引。

    2.A表username字段建立索引,B表username字段不建立索引且默认为空。

    3.B表email字段建立索引,A表email字段不建立索引且默认为空。

    OK,那么表设计就完成了。

    那么我们就可以利用这种表设计减少我们查询的量来优化查询速度。

    对于有索引的字段,在mysql数据库information_schema的statistics表里面保存了所有表的索引信息,那么我们就可以利用这个表来过滤掉我们要查询的字段没有建立索引的表。

    比如我要查询info库里面邮箱为[email protected]的信息。那么这个查询中我会丢掉A表,因为A表email字段为空,肯定没有我要查询的[email protected]信息。

    那么如何过滤掉A表。一条SQL语句即可:

    SELECT TABLE_NAME FROM information_schema.statistics WHERE INDEX_NAME!=’PRIMARY’ and table_schema = ‘info’ and COLUMN_NAME=’email’ GROUP BY TABLE_NAME;

    利用这条语句,就可以输出info库email字段存在索引的表。然后利用脚本动态拼接union查询语句查询即可。

    我的环境是USB3.0 2TB移动硬盘,笔记本win7 i7-4700,8G内存。20亿数据查询速度在1~3秒。

    展开全文
  • internetusers用户之谜

    2019-09-21 23:03:38
    三番几次被人增加系统用户,用户名都internetusers,问问同事的笔记本电脑最近都做什么了,答复是一家软件公司给安装了一套数据库软件,这下基本明白怎么回事了,按了2次重启键,以前的用户登录到系统,看到了sql...

    同事的一台笔记本电脑装的xp系统,三番几次被人增加系统用户,用户名都internetusers,问问同事的笔记本电脑最近都做什么了,答复是一家软件公司给安装了一套数据库软件,这下基本明白怎么回事了,按了2次重启键,用以前的用户登录到系统,看到了sqlserver的运行图标,打开查询分析器,用sa登录,密码为空,登录成功,没检查是否有木马什么的。

     


    上网搜索了一下internetusers这个关键词,发现不少人遇到过这个问题,都是安装了sqlserver,sa密码设置的过于简单造成的,估计入侵者使用了某种批量抓肉鸡的软件。大家都不容易,实在看不过去就写了这篇文章。做研究也好,或者有其他目的也好,尽量不要影响用户的正常使用啊,像xp系统就不要加用户了,给使用者带来不少麻烦,我的那位同事还以为系统的密码记错了。有些地方还真弄不明白,如果是为了控制这些有漏洞的计算机,一个木马就行了,没必要加用户,如果想3389,这些xp系统绝大部分只能单用户登录,容易暴露啊,如果有知道内幕的朋友,还望赐教。

    sa弱口令造成的后果很严重,我以前也写过几篇这方面的文章(http://www.cnking.org/post/286.html),普通计算机使用者可能不懂这些,你软件公司的技术人员应该知道点吧,给那家软件公司的经理

    转载于:https://www.cnblogs.com/sankeshu/archive/2011/05/10/2785902.html

    展开全文
  • 先说一件事吧,去年同事的一台笔记本电脑装的xp系统,三番几次被人增加系统用户,用户名都internetusers,问问同事的笔记本电脑最近都做什么了,答复是一家软件公司给安装了一套数据库软件,这下基本明白怎么回事了...
  • 在每个脚本在同一个ipython笔记本中运行时都能工作,当我试图下面的代码创建模块时,它失败了:我的pulldata.py脚本:def main()import matplotlib.pyplot as pltimport datetimeimport sqlite3c...
  • 也不知道有什么用,就是想着玩玩...可能是之前数据库训练数据留下的病吧、 1.现在网上找来了百家姓 是这个格式的,于是想sed等linux工具弄成一个字一行的,便于处理,未果.又想写程序实现,c/c++憋了两天...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

做数据库用什么笔记本