【问题标题】:How can I dump a MySQL database without using mysqldump in Python [closed]如何在不使用 Python 中的 mysqldump 的情况下转储 MySQL 数据库 [关闭]
【发布时间】:2012-10-09 01:27:48
【问题描述】:

如何在不使用 mysqldump 的情况下转储 MySQL 数据库,只使用包含表结构的 Python?

【问题讨论】:

  • 为什么没有mysqldump?对mysqldump 进行系统调用将是迄今为止最简单的方法。
  • 这不是编程问题。这是一个“我怎样才能让我的问题变得不必要地困难”的问题。
  • 我希望我的应用程序具有可移植性,并且依赖很少。我不使用 MySQLdump 的原因
  • 我不能将mysqldump 与我的提供程序一起使用,但我可以使用 SQL 查询。我认为这个问题很有趣,应该重新打开。
  • 我认为这是一个非常有效的问题。我遇到了几个使用不同(专用)服务器来处理 Web 应用程序和数据库的主机。在这些情况下,mysqldump 在 Web 应用程序服务器上不可用,并且不能用于备份目的。

标签: python mysql


【解决方案1】:

我已经解决了这个问题。

import MySQLdb
import os
import datetime

con = MySQLdb.connect(host='localhost', user='root', passwd='password', db='test')
cur = con.cursor()

cur.execute("SHOW TABLES")
data = ""
tables = []
for table in cur.fetchall():
    tables.append(table[0])

for table in tables:
    data += "DROP TABLE IF EXISTS `" + str(table) + "`;"

    cur.execute("SHOW CREATE TABLE `" + str(table) + "`;")
    data += "\n" + str(cur.fetchone()[1]) + ";\n\n"

    cur.execute("SELECT * FROM `" + str(table) + "`;")
    for row in cur.fetchall():
        data += "INSERT INTO `" + str(table) + "` VALUES("
        first = True
        for field in row:
            if not first:
                data += ', '
            data += '"' + str(field) + '"'
            first = False


        data += ");\n"
    data += "\n\n"

now = datetime.datetime.now()
filename = str(os.getenv("HOME")) + "/backup_" + now.strftime("%Y-%m-%d_%H:%M") + ".sql"

FILE = open(filename,"w")
FILE.writelines(data)
FILE.close()

通过一些测试似乎效果很好。

【讨论】:

  • 请注意,pymysqlMySQLdb 的替代品,后者是纯 Python,适用于 Python 2.7 和 Python 3.X。
  • 这是一个很好的努力,但可悲的是,MySQLdb 没有提供转储数据库的调用,而是我们必须执行查询并获得需要手动附加到文件中的响应,这只是很长的路要走周围
  • 补充一点:您可以通过直接写入文件而不是附加到data 变量来节省一些系统内存。例如:FILE.write("DROP TABLE...
  • 有道理@Aron
  • 这是否忽略了外键/约束以及有关数据库的其他信息?
【解决方案2】:

我建议MySQLdb - 它为 Python 提供 MySQL API。

但是,API 很可能间接调用了mysqldump。你不想直接或根本不想打电话给mysqldump

您可能还想查看Dump tables and data,其中显示了在没有 MySQLdb 的情况下转储表结构和数据(页面下方)的确切过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多