我有一个 sql 转储文件,其中包含我需要查询的整个 maria 数据库。转储有多个 GB 大。
问题是我无权访问本地数据库安装,并且由于公司 IT 安全限制而无法获得本地数据库安装。
我可以在 sqlite3 中通过 python 迭代并执行我的转储吗?我找不到关于如何执行此操作的正确解释。
我使用此代码片段来迭代我的转储,并至少获取所有表名称作为回报,以获得对数据库的概述:
table_list=[]
with open(dmp.file ,encoding='cp437') as f:
for line in f:
line = line.strip()
if line.lower().startswith('create table'):
table_name = re.findall('create table `([\w_]+)`', line.lower())
table_list.extend(table_name)
for x in table_list:
print(x)
这工作得很好,但是在我用于创建表等的转储语句中会跨越多行,因此这种方法不再能很好地工作。我写了以下内容,将语句写成一行。
currentLine = ""
with open(File,encoding='cp437') as f:
for line in f:
line = line.strip()
currentLine = currentLine + " " + line
if line.lower().endswith(';') == True:
with open(NewFileOneLiner.txt', "a", encoding="utf-8") as g:
g.write(currentLine.lstrip() + '\n')
currentLine = ""
我想知道还需要什么额外的步骤,因为从理论上讲,两个 SQL 数据库都可以转换 SQL 语句。有没有办法执行sqlite中的所有语句?这种方法的界限和注意事项在哪里?在这种情况下,sqlite 是否不支持我需要了解的一些 SQL 关键概念?
虽然有 SQL 标准,但没有人完全遵循它(它是巨大的)并且每个人都扩展它。每个 SQL 数据库都有不同的方言,实现规范的不同部分,并且有自己的怪癖和扩展。更糟糕的是,一些非常标准的 SQL 并不标准。例如,该标准没有提及索引,它们被认为是一个实现问题。 只有最简单的 SQL 才能在不同的实现之间运行相同的结果。
SQLite 被设计为“轻量级”数据库。它的主要特点是不需要服务器,一个程序可以有自己独立的数据库。 SQLite 具有极其有限的 SQL 子集以及与 MariaDB 不同的行为。除了最简单的 SQL 之外,尝试翻译任何内容都是不切实际的,而且我不会相信结果。
我建议与 IT 部门讨论获取完成工作所需的工具,他们应该为您提供 MariaDB 服务器。如果他们不这样做,请去找为您分配任务的人并通知他们。或者,您可以以不到 1 美元的价格在便宜的虚拟机上安装MariaDB。然后拿一些办公用品要求报销。
另一种可能的解决方案或解决方法是将所有所需表的 Insert 语句转换为 csv。这样就可以在 pandas 或其他工具中分析数据:
第一步:创建函数以从特定表中提取插入内容:
def extract_inserts(file_name, table_name):
result = ""
with open(file_name, "br",) as file_object:
for line in file_object:
string_line = str(line.decode('latin1'))
if f"INSERT INTO `{table_name.upper()}" in string_line.upper():
result += string_line.replace(
"),(", "\n").replace(
f"""INSERT INTO `{table_name}` VALUES (""", "").replace(
';\n"', ""
)
return result
第二步:创建所有所需表的列表:
TABLE_NAMES = ["Table1", "Table2", "Table3"]
第三步:在所需的表上运行 extract_inserts:
if __name__ == "__main__":
file_name = r'YourInputFilePath'
table_names = TABLE_NAMES
for table_name in TABLE_NAMES:
print(f"writing to file --->{table_name}.txt")
with open(r'YourOutputFilePath', "w", encoding="latin1") as file_handle:
dml = extract_inserts(file_name, table_name)
file_handle.write(dml)