Java、PHP、Python与MySQL交互的性能测试

这几天看源码弄清了一件事:WEB服务器接收浏览器请求、将请求传给PHP/Python进程(FCGI等)、与数据库进行交互都是用socket(套接字)。 
也就是说,这些行为都是进程间通信。一台WEB服务器在硬件、操作系统不变的情况下,它的性能主要取决于socket通信的速度。如果所有进程都在一台服务器上的话,这个速度就取决于通信的效率了。

例如与MySQL数据库交互时,程序会调用驱动程序来访问数据库,这个驱动程序主要做这几件事:

1.创建socket,连接到MySQL。

2.将程序调用的API翻译成SQL语句,通过socket发送给MySQL;MySQL执行后,将结果发送回来;驱动程序将结果(字符串)传给程序,如有需要,还可以自动翻译成程序能识别的变量类型(如整型)。

3.断开连接。

可见连接的速度、翻译的速度和接受响应的及时性是最主要的3个方面。

弄明白这点后就不难发现,与数据库的执行时间相比,这些只是很少的一部分;而且PHP和Python使用的都是C实现,而JDBC是用Java实现,所以根本不必担心PHP和Python的性能。 
不过在翻译方面还存在算法和实现上的差异,客户端还可以缓存一些语句,所以仍然会出现一些性能上的差异。 
为证明我的想法,我特意去测试了一番。

首先列出测试平台:

引用

CPU:Intel Core2 Duo T9400 @ 2.53GHz 
内存:3GB 
操作系统:Windows XP Pro SP2 
MySQL:5.1.36 
Java:1.6.0_17-b04 
JDBC:MySQL Connector/J 5.1.10 
PHP:5.2.11 (cli) 
MySQLi:5.2.11.11 
Python:2.6.4 
MySQL-Python:1.2.3c1

所用的库都是最新版的,也都采用了最为推荐的库。 
但数据库并没有使用最新的稳定版,因为我懒得重下了。5.4.3-beta测试版也试过,在连续插入时,性能比5.1快1~2个数量级,估计是服务器端缓存和设置的原因。

测试项目:

1.创建100万个随机数,并生成插入这些随机数的SQL语句。

2.连接本地数据库,如不成功,尝试创建数据库。

3.删除并创建数据库表,引擎类型为InnoDB,主键为自动递增的整数,此外有个浮点型的字段(无索引)。

4.分成100组,每次插入1万个随机数。(因为每组的执行量都很大,因此启用自动提交事务。)

5.用SELECT COUNT(*)统计小于0.1的随机数个数。(约10万个)

6.用SELECT *取出再统计大于0.9的随机数个数。(约10万个)

7.将所有0.4~0.5之间的随机数加1。(约10万个)

8.将所有0.5~0.6之间的行删除。(约20万个)

9.断开数据库连接。

10.再次连接数据库。

测试代码:

Java:

Java代码  

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.SQLException;
  4. import java.sql.Statement;
  5. import java.sql.ResultSet;
  6. import java.util.Random;
  7. public final class Test {
  8. public static void main(String[] args) {
  9. final int SIZE1 = 10000;
  10. final int SIZE2 = 100;
  11. final String DB_ENGINE = "InnoDB"; // InnoDB Memory MyISAM
  12. final double NANO_TIME_PER_SEC = 1000000000.0;
  13. System.out.printf("测试数据量:%d\n", SIZE1 * SIZE2);
  14. System.out.printf("测试引擎:%s\n", DB_ENGINE);
  15. long t1 = System.nanoTime(), t2, t3 = 0, t4, t5, t6, t7, t8, t9, t10, t11;
  16. Connection conn = null;
  17. Statement stmt = null;
  18. ResultSet rs = null;
  19. Random r = new Random();
  20. String[] sqls = new String[SIZE2];
  21. for (int i = 0; i < SIZE2; ++i){
  22. StringBuilder buffer = new StringBuilder("INSERT INTO test (value) VALUES (");
  23. for (int j = 0; j < SIZE1; ++j){
  24. buffer.append(r.nextDouble()).append("),(");
  25. }
  26. sqls[i] = buffer.substring(0, buffer.length() -2);
  27. }
  28. t2 = System.nanoTime();
  29. try {
  30. conn = DriverManager.getConnection("jdbc:mysql://localhost/testdb?user=root&password=123456");
  31. t3 = System.nanoTime();
  32. stmt = conn.createStatement();
  33. } catch (SQLException e) {
  34. try {
  35. conn = DriverManager.getConnection("jdbc:mysql://localhost/?user=root&password=123456");
  36. t3 = System.nanoTime();
  37. stmt = conn.createStatement();
  38. stmt.execute("CREATE DATABASE testdb");
  39. } catch (SQLException ex) {
  40. System.out.println("SQLException: " + ex.getMessage());
  41. System.out.println("SQLState: " + ex.getSQLState());
  42. System.out.println("VendorError: " + ex.getErrorCode());
  43. }
  44. }
  45. try {
  46. stmt.execute("DROP TABLE test");
  47. } catch (SQLException e) {
  48. }
  49. try {
  50. stmt.execute("CREATE TABLE test (`id` INT AUTO_INCREMENT PRIMARY KEY, `value` REAL) ENGINE = " + DB_ENGINE);
  51. } catch (SQLException e) {
  52. }
  53. t4 = System.nanoTime();
  54. try {
  55. for (String sql: sqls){
  56. stmt.execute(sql);
  57. }
  58. t5 = System.nanoTime();
  59. rs = stmt.executeQuery("SELECT COUNT(*) FROM test WHERE value < 0.1");
  60. if (rs.next())
  61. System.out.printf("共有%d个小于0.1的随机数\n", rs.getInt(1));
  62. t6 = System.nanoTime();
  63. rs = stmt.executeQuery("SELECT * FROM test WHERE value > 0.9");
  64. if (rs.last())
  65. System.out.printf("共有%d个大于0.9的随机数\n", rs.getRow());
  66. t7 = System.nanoTime();
  67. stmt.executeUpdate("UPDATE test SET value = value + 0.1 WHERE value > 0.4 AND value < 0.5");
  68. t8 = System.nanoTime();
  69. stmt.execute("DELETE FROM test WHERE value > 0.5 AND value < 0.6");
  70. t9 = System.nanoTime();
  71. stmt.close();
  72. conn.close();
  73. t10 = System.nanoTime();
  74. conn = DriverManager.getConnection("jdbc:mysql://localhost/?user=root&password=123456");
  75. t11 = System.nanoTime();
  76. conn.close();
  77. System.out.printf("创建随机数:%f\n", (t2 - t1) / NANO_TIME_PER_SEC);
  78. System.out.printf("初次连接数据库:%f\n", (t3 - t2) / NANO_TIME_PER_SEC);
  79. System.out.printf("再次连接数据库:%f\n", (t11 - t10) / NANO_TIME_PER_SEC);
  80. System.out.printf("初始化数据库和表:%f\n", (t4 - t3) / NANO_TIME_PER_SEC);
  81. System.out.printf("插入:%f\n", (t5 - t4) / NANO_TIME_PER_SEC);
  82. System.out.printf("选择(COUNT):%f\n", (t6 - t5) / NANO_TIME_PER_SEC);
  83. System.out.printf("选择:%f\n", (t7 - t6) / NANO_TIME_PER_SEC);
  84. System.out.printf("更新:%f\n", (t8 - t7) / NANO_TIME_PER_SEC);
  85. System.out.printf("删除:%f\n", (t9 - t8) / NANO_TIME_PER_SEC);
  86. System.out.printf("关闭连接:%f\n", (t10 - t9) / NANO_TIME_PER_SEC);
  87. System.out.printf("总时间:%f\n", (t10 - t1) / NANO_TIME_PER_SEC);
  88. } catch (SQLException ex) {
  89. System.out.println("SQLException: " + ex.getMessage());
  90. System.out.println("SQLState: " + ex.getSQLState());
  91. System.out.println("VendorError: " + ex.getErrorCode());
  92. }
  93. }
  94. }

PHP:

Php代码  

  1. <?php
  2. define(‘SIZE1‘, 10000);
  3. define(‘SIZE2‘, 100);
  4. define(‘DB_ENGINE‘, ‘InnoDB‘); // InnoDB Memory MyISAM
  5. printf("测试数据量:%d\n", SIZE1 * SIZE2);
  6. printf("测试引擎:%s\n", DB_ENGINE);
  7. $t1 = microtime(true);
  8. for ($i = 0; $i < SIZE2; ++$i){
  9. for ($j = 0; $j < SIZE1; ++$j){
  10. $buffer[] = lcg_value();
  11. }
  12. $sqls[$i] = ‘INSERT INTO test (value) VALUES (‘.join(‘),(‘, $buffer).‘)‘;
  13. unset($buffer);
  14. }
  15. $t2 = microtime(true);
  16. $db = new mysqli(‘localhost‘, ‘root‘, ‘123456‘, ‘testdb‘);
  17. $t3 = microtime(true);
  18. if (mysqli_connect_errno()) {
  19. $db = new mysqli(‘localhost‘, ‘root‘, ‘123456‘);
  20. $t3 = microtime(true);
  21. $db->query(‘CREATE DATABASE testdb‘);
  22. $db->select_db(‘testdb‘);
  23. }
  24. $db->query(‘DROP TABLE test‘);
  25. $db->query(‘CREATE TABLE test (`id` INT AUTO_INCREMENT PRIMARY KEY, `value` REAL) ENGINE = ‘.DB_ENGINE);
  26. $t4 = microtime(true);
  27. foreach ($sqls as $key=>$sql) {
  28. $db->query($sql);
  29. }
  30. $t5 = microtime(true);
  31. $result = $db->query(‘SELECT COUNT(*) FROM test WHERE value < 0.1‘)->fetch_row();
  32. printf("共有%d个小于0.1的随机数\n", $result[0]);
  33. $t6 = microtime(true);
  34. $result = $db->query(‘SELECT * FROM test WHERE value > 0.9‘);
  35. printf("共有%d个大于0.9的随机数\n", $result->num_rows);
  36. $t7 = microtime(true);
  37. $db->query(‘UPDATE test SET value = value + 0.1 WHERE value > 0.4 AND value < 0.5‘);
  38. $t8 = microtime(true);
  39. $db->query(‘DELETE FROM test WHERE value > 0.5 AND value < 0.6‘);
  40. $t9 = microtime(true);
  41. $db->close();
  42. $t10 = microtime(true);
  43. $db = new mysqli(‘localhost‘, ‘root‘, ‘123456‘, ‘testdb‘);
  44. $t11 = microtime(true);
  45. $db->close();
  46. printf("创建随机数:%f\n", $t2 - $t1);
  47. printf("初次连接数据库:%f\n", $t3 - $t2);
  48. printf("再次连接数据库:%f\n", $t11 - $t10);
  49. printf("初始化数据库和表:%f\n", $t4 - $t3);
  50. printf("插入:%f\n", $t5 - $t4);
  51. printf("选择(COUNT):%f\n", $t6 - $t5);
  52. printf("选择:%f\n", $t7 - $t6);
  53. printf("更新:%f\n", $t8 - $t7);
  54. printf("删除:%f\n", $t9 - $t8);
  55. printf("关闭连接:%f\n", $t10 - $t9);
  56. printf("总时间:%f\n", $t10 - $t1);
  57. ?>

Python:

Python代码  

  1. # -*- coding: gbk -*-
  2. import MySQLdb
  3. from random import random
  4. from time import clock
  5. SIZE1 = 10000
  6. SIZE2 = 100
  7. DB_ENGINE = ‘InnoDB‘ # InnoDB Memory MyISAM
  8. print ‘测试数据量:‘, SIZE1 * SIZE2
  9. print ‘测试引擎:‘, DB_ENGINE
  10. t1 = clock()
  11. sqls = [‘INSERT INTO test (value) VALUES (%s)‘ % ‘),(‘.join([`random()` for i in xrange(SIZE1)]) for j in xrange(SIZE2)]
  12. t2 = clock()
  13. try:
  14. con = MySQLdb.connect(user=‘root‘, passwd=‘123456‘, db=‘testdb‘)
  15. t3 = clock()
  16. cu = con.cursor()
  17. except:
  18. con = MySQLdb.connect(user=‘root‘, passwd=‘123456‘)
  19. t3 = clock()
  20. cu = con.cursor()
  21. cu.execute(‘CREATE DATABASE testdb‘)
  22. con.select_db(‘testdb‘)
  23. con.autocommit(True)
  24. try:
  25. cu.execute(‘DROP TABLE test‘)
  26. except:
  27. pass
  28. cu.execute(‘‘‘‘‘CREATE TABLE test (
  29. `id` INT AUTO_INCREMENT PRIMARY KEY,
  30. `value` REAL)
  31. ENGINE = %s‘‘‘ % DB_ENGINE)
  32. t4 = clock()
  33. for sql in sqls:
  34. cu.execute(sql)
  35. t5 = clock()
  36. cu.execute(‘SELECT COUNT(*) FROM test WHERE value < 0.1‘)
  37. print ‘共有%d个小于0.1的随机数‘ % cu.fetchone()[0]
  38. t6 = clock()
  39. cu.execute(‘SELECT * FROM test WHERE value > 0.9‘)
  40. print ‘共有%d个大于0.9的随机数‘ % len(cu.fetchall())
  41. t7 = clock()
  42. cu.execute(‘UPDATE test SET value = value + 0.1 WHERE value > 0.4 AND value < 0.5‘)
  43. t8 = clock()
  44. cu.execute(‘DELETE FROM test WHERE value > 0.5 AND value < 0.6‘)
  45. t9 = clock()
  46. cu.close()
  47. con.close()
  48. t10 = clock()
  49. con = MySQLdb.connect(user=‘root‘, passwd=‘123456‘, db=‘testdb‘)
  50. t11 = clock()
  51. con.close()
  52. print ‘创建随机数:‘, t2 - t1
  53. print ‘初次连接数据库:‘, t3 - t2
  54. print ‘再次连接数据库:‘, t11 - t10
  55. print ‘初始化数据库:‘, t4 - t3
  56. print ‘插入:‘, t5 - t4
  57. print ‘选择(COUNT)‘, t6 - t5
  58. print ‘选择:‘, t7 - t6
  59. print ‘更新:‘, t8 - t7
  60. print ‘删除:‘, t9 - t8
  61. print ‘关闭连接:‘, t10 - t9
  62. print ‘总时间:‘, t10 - t1

MySQL-Python还有个底层的模块,一并测试下:

Python代码  

  1. # -*- coding: gbk -*-
  2. import _mysql
  3. from MySQLdb.converters import conversions
  4. from random import random
  5. from time import clock
  6. SIZE1 = 10000
  7. SIZE2 = 100
  8. DB_ENGINE = ‘InnoDB‘ # InnoDB Memory MyISAM
  9. print ‘测试数据量:‘, SIZE1 * SIZE2
  10. print ‘测试引擎:‘, DB_ENGINE
  11. t1 = clock()
  12. sqls = [‘INSERT INTO test (value) VALUES (%s)‘ % ‘),(‘.join([`random()` for i in xrange(SIZE1)]) for j in xrange(SIZE2)]
  13. t2 = clock()
  14. try:
  15. con = _mysql.connect(user=‘root‘, passwd=‘123456‘, db=‘testdb‘, conv=conversions)
  16. t3 = clock()
  17. except:
  18. con = _mysql.connect(user=‘root‘, passwd=‘123456‘, conv=conversions)
  19. t3 = clock()
  20. con.query(‘CREATE DATABASE testdb‘)
  21. con.select_db(‘testdb‘)
  22. con.autocommit(True)
  23. try:
  24. con.query(‘DROP TABLE test‘)
  25. except:
  26. pass
  27. con.query(‘‘‘‘‘CREATE TABLE test (
  28. `id` INT AUTO_INCREMENT PRIMARY KEY,
  29. `value` REAL)
  30. ENGINE = %s‘‘‘ % DB_ENGINE)
  31. t4 = clock()
  32. for sql in sqls:
  33. con.query(sql)
  34. t5 = clock()
  35. con.query(‘SELECT COUNT(*) FROM test WHERE value < 0.1‘)
  36. print ‘共有%d个小于0.1的随机数‘ % con.store_result().fetch_row()[0]
  37. t6 = clock()
  38. con.query(‘SELECT * FROM test WHERE value > 0.9‘)
  39. print ‘共有%d个大于0.9的随机数‘ % con.store_result().num_rows()
  40. t7 = clock()
  41. con.query(‘UPDATE test SET value = value + 0.1 WHERE value > 0.4 AND value < 0.5‘)
  42. t8 = clock()
  43. con.query(‘DELETE FROM test WHERE value > 0.5 AND value < 0.6‘)
  44. t9 = clock()
  45. con.close()
  46. t10 = clock()
  47. con = _mysql.connect(user=‘root‘, passwd=‘123456‘, db=‘testdb‘, conv=conversions)
  48. t11 = clock()
  49. con.close()
  50. print ‘创建随机数:‘, t2 - t1
  51. print ‘初次连接数据库:‘, t3 - t2
  52. print ‘再次连接数据库:‘, t11 - t10
  53. print ‘初始化数据库:‘, t4 - t3
  54. print ‘插入:‘, t5 - t4
  55. print ‘选择(COUNT)‘, t6 - t5
  56. print ‘选择:‘, t7 - t6
  57. print ‘更新:‘, t8 - t7
  58. print ‘删除:‘, t9 - t8
  59. print ‘关闭连接:‘, t10 - t9
  60. print ‘总时间:‘, t10 - t1

每种测试3次(等硬盘灯无闪烁后才进行下一次测试),取最好的一次作为测试结果: 
Java:

引用

测试数据量:1000000 
测试引擎:InnoDB 
共有99465个小于0.1的随机数 
共有99859个大于0.9的随机数 
创建随机数:2.367840 
初次连接数据库:0.220420 
再次连接数据库:0.013174 
初始化数据库和表:0.075140 
插入:12.139346 
选择(COUNT):1.130345 
选择:1.017769 
更新:6.173245 
删除:9.380070 
关闭连接:0.002131 
总时间:32.506307

PHP:

引用

测试数据量:1000000 
测试引擎:InnoDB 
共有99898个小于0.1的随机数 
共有100152个大于0.9的随机数 
创建随机数:1.506294 
初次连接数据库:0.003146 
再次连接数据库:0.001808 
初始化数据库和表:0.131754 
插入:12.046944 
选择(COUNT):1.236742 
选择:1.238153 
更新:6.115232 
删除:8.145547 
关闭连接:0.000125 
总时间:30.423937

Python(MySQLdb):

引用

测试数据量: 1000000 
测试引擎: InnoDB 
共有100040个小于0.1的随机数 
共有100351个大于0.9的随机数 
创建随机数: 1.6822107279 
初次连接数据库: 0.0332120423126 
再次连接数据库: 0.00221704155137 
初始化数据库: 0.131054924578 
插入: 11.7999030603 
选择(COUNT) 1.27067266929 
选择: 1.16714526567 
更新: 6.29200638629 
删除: 8.13660563005 
关闭连接: 0.000131022238861 
总时间: 30.5129417286

Python(_mysql):

引用

测试数据量: 1000000 
测试引擎: InnoDB 
共有99745个小于0.1的随机数 
共有99869个大于0.9的随机数 
创建随机数: 1.68099074044 
初次连接数据库: 0.0112056141213 
再次连接数据库: 0.00159293988482 
初始化数据库: 0.130169616529 
插入: 12.1364623157 
选择(COUNT) 1.125517908 
选择: 0.968366649951 
更新: 6.8042843434 
删除: 8.9760508668 
关闭连接: 9.61015995031e-05 
总时间: 31.8331441566

可以看到,在大批量数据测试中,Java是最慢的,而PHP是最快的。 
不考虑IO性能的波动的话,Java主要慢在连接和关闭数据库。JDBC

4.0在第一次连接数据库时会动态加载驱动,非常耗时,因此使用Java要记住使用数据库连接池,避免连接浪费大量时间。当然,这也造成了数据库的负担,势必影响内存占用。而创建随机数的算法实现各不相同,所以不具备可比性;令我惊讶的是SELECT的翻译速度,将字符串转换成浮点数居然慢于Python,要知道后者的浮点数可是对象。 
PHP连接数据库非常快,所以完全无需使用连接池,因为维护连接池会增加复杂性。 
Python的表现和PHP差不多,但是第一次连接数据库比较慢(仍比Java快1个数量级)。如果不用连接池,则使用FCGI等方式来运行比较合适。_mysql模块的通信很快,但更新和删除操作却不太理想,也许是IO性能波动的原因。此外,我在连接数据库时使用了转换参数,实际上我用的语句都不需要翻译,不使用的话会更快一点。

接着试试小数据,改成最常用的MyISAM引擎,插入100条(1组)。一般的应用不可能一次插入那么多,所以足够满足平时的应用了;而且由于数据量很小,也基本不受IO影响。

测试结果:

Java:

引用

测试数据量:100 
测试引擎:MyISAM 
共有9个小于0.1的随机数 
共有10个大于0.9的随机数 
创建随机数:0.001596 
初次连接数据库:0.224135 
再次连接数据库:0.018656 
初始化数据库和表:0.055601 
插入:0.001476 
选择(COUNT):0.000529 
选择:0.000433 
更新:0.000304 
删除:0.000313 
关闭连接:0.000927 
总时间:0.285314

PHP:

引用

测试数据量:测试数据量:100 
测试引擎:MyISAM 
共有12个小于0.1的随机数 
共有9个大于0.9的随机数 
创建随机数:0.000649 
初次连接数据库:0.008077 
再次连接数据库:0.001609 
初始化数据库和表:0.060421 
插入:0.001860 
选择(COUNT):0.000580 
选择:0.000465 
更新:0.000326 
删除:0.000373 
关闭连接:0.000127 
总时间:0.072878

Python(MySQLdb):

引用

测试数据量: 100 
测试引擎: MyISAM 
共有14个小于0.1的随机数 
共有9个大于0.9的随机数 
创建随机数: 0.000198907961766 
初次连接数据库: 0.0334640296462 
再次连接数据库: 0.00150577796899 
初始化数据库: 0.0123194428342 
插入: 0.00125211444471 
选择(COUNT) 0.000581079438867 
选择: 0.000484139744018 
更新: 0.000250311142897 
删除: 0.000262323842835 
关闭连接: 7.98984228442e-05 
总时间: 0.0488922474784

Python(_mysql):

引用

测试数据量: 100 
测试引擎: MyISAM 
共有12个小于0.1的随机数 
共有10个大于0.9的随机数 
创建随机数: 0.000214273043082 
初次连接数据库: 0.0118774872225 
再次连接数据库: 0.00123702872851 
初始化数据库: 0.0315031659052 
插入: 0.00120322554962 
选择(COUNT) 0.000596165155069 
选择: 0.000507327048549 
更新: 0.0002447238406 
删除: 0.00026148574749 
关闭连接: 5.78285787719e-05 
总时间: 0.0464656820909

从结果可以看出,虽然差距都很小,但Python仍然稍微占优。不过Java的SELECT操作稍微胜出,而这也是实际应用中最常使用的操作。 
再从语言方面来看,Python无疑是写得最欢畅的,生成随机数只用了1行代码;PHP的变量要写个$让我老是出错,不过数据库操作不需要处理异常,这点节省了很多代码;Java的代码量很大,而且不得不使用很多try...catch,我甚至懒得以安全的方式将close()放在finally块里面,因为它也会抛出我根本懒得去管的异常,且会提示我计时变量可能没有初始化。

总体上来看,Google放弃Python,只采用C++和Java是有点不明智。因为页面响应时间主要在于数据库通信和磁盘文件IO上,语言的影响基本忽略不计。

时间: 2024-10-07 05:27:22

Java、PHP、Python与MySQL交互的性能测试的相关文章

二十、Python与Mysql交互

先安装一个python与MySQL交互的包:MySQL-python $ gunzip MySQL-python-1.2.2.tar.gz $ tar -xvf MySQL-python-1.2.2.tar $ cd MySQL-python-1.2.2 $ python setup.py build $ python setup.py install ========================================================================

python学习-python与mysql交互

一.使用pymysql进行交互 安装::: pip install pymysql pymysql主要是使用原生sql与mysql进行交互,示例如下: import pymysql #创建连接 conn = pymysql.connect(host='192.168.0.26',port=3306,user='xll', passwd='xll123',db='mysql' ) #创建游标 cursor = conn.cursor() #执行sql,并返回受影响的行数 effect_row =

python与mysql交互中的各种坑

开始学python 交互MySQLdb,踩了很多坑 第一个 %d format: a number is required, not str 参照以下博客: https://blog.csdn.net/u011878172/article/details/72599120 # -*- coding: utf-8 -*- import MySQLdb try: conn=MySQLdb.connect(host='localhost',port='3306',db='test',user='roo

python与mysql交互之虚拟环境搭建

在使用命令 sudo pip install 包名称   进行包的安装时,会安装到/usr/local/lib/python2.7/dist-packages下.接下来问题就出来了,如果在一台机器上,想开发多个不同的项目,需要用到同一个包的不同版本,如果还使用上面的命令,在同一个目录下安装或者更新,其它的项目必须就无法运行了,怎么办呢? 解决方案:虚拟环境 虚拟环境可以搭建独立的python运行环境,使得单个项目的运行环境与其它项目互不影响 所有的虚拟环境,都位于/home/python下的隐藏

python与mysql交互

con = MySQLdb.connect(host="localhost(host='localhost'.user='root',password= dfb = cur = c.cursor cur.excute("show tables;) cur.close c.close

python3.5 与 mysql 交互

python与mysql交互,官网是有connertor支持的,Connector/Python现在最高支持到python3.4: http://dev.mysql.com/downloads/connector/python/ 不过3.5可以用开源的pymysql来连接: https://github.com/PyMySQL/PyMySQL 简单的使用sample: MySql数据库准备: use test create table testTbl (     tId int not null

第一节、Alex 讲解 python+mysql 交互;

Python Mysql 交互 A.Alex 的语法展示: import MySQLdb  try: conn=MySQL.connect(host='localhost',user='root',passwod='123qwe',db='test-DB',port='3306') cur =conn.cursor() cur.execute('select * from user_info') cur.close() conn.close() except MySQLdb.Errot,e: p

第十一节:python mysql交互、socket、多线程

python个人笔记,纯属方便查询. ------------------------------------python mysql交互---------------------------------------  #查询: import MySQLdb try:         conn=MySQLdb.connect(host='10.86.10.21',user='root',passwd='mysql',db='python',port=3306)         cur=conn.

Python 12 - Mysql &amp; ORM

本节内容 1.数据库介绍 2.mysql数据库安装使用 3.mysql数据库基础 4.mysql命令 5.事务 6.索引 7.Python操作mysql 8.ORM sqlalchemy了解 数据库介绍 什么是数据库? (介于本人还是属于熟悉数据库的,这一块就基本复制粘贴了) 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢.