【问题标题】:SQLite3: an empty database after running python codeSQLite3:运行python代码后的空数据库
【发布时间】:2021-05-15 22:18:51
【问题描述】:

我想用两张表做一个简单的数据库。所以我使用这段代码来制作它并填充我的 .csv 数据:

import sqlite3
import pandas as pd
import os

conn = sqlite3.connect("base.db")
c = conn.cursor()

c.execute('''
CREATE TABLE IF NOT EXISTS table_1 (
Name TEXT,
Index INTEGER,
Sample_ID TEXT PRIMARY KEY);
''')

c.execute('''
CREATE TABLE IF NOT EXISTS table_2 (
Other_id TEXT PRIMARY KEY,
info TEXT);
''')

cmd1 = """sqlite3 base.db <<< ".import table_1.csv table_1" """
cmd2 = """sqlite3 base.db <<< ".import table_2.csv table_2" """

rc1 = os.system(cmd1)
rc2 = os.system(cmd2)

conn.commit()

conn.close()

我得到一个带有数据库的文件,但是当我在 DBeaver 中使用这个命令 SELECT COUNT(*) FROM table_2; 时,我得到零计数。此外,.db 文件的大小为 20.5 kB(20480 字节)。

我该如何解决?为什么我的数据库是空的?

我用这个:

  • Ubuntu 20.04
  • Python 3.8.5
  • sqlite3 3.31.1
  • DBeaver 21.0.4

【问题讨论】:

  • 代码看起来没问题,你能检查一下 DBeaver 是否指向base.db 还看看你是否在 os.系统运行cmd1和cmd2。

标签: python database sqlite


【解决方案1】:

下面是一个经过测试和工作的示例,使用来自这个 SO 答案的.import 解决方案:https://stackoverflow.com/a/41788666/42346
您使用 os.system() 发送的命令有多个问题。
另一个问题是你不能重复使用保留字Index作为列名,所以我把它改成了Idx

import sqlite3
import pandas as pd
import os

conn = sqlite3.connect("base.db")
c = conn.cursor()

# note change from `Index` to `Idx` because the former is a reserved word in SQLite
c.execute('''
CREATE TABLE IF NOT EXISTS table_1 (
Name TEXT,
Idx INTEGER,
Sample_ID TEXT PRIMARY KEY);
''')

c.execute('''
CREATE TABLE IF NOT EXISTS table_2 (
Other_id TEXT PRIMARY KEY,
info TEXT);
''')

cmd1 = """(echo .separator ,; echo .import table_1.csv table_1) | sqlite3 base.db"""
cmd2 = """(echo .separator ,; echo .import table_2.csv table_2) | sqlite3 base.db"""

rc1 = os.system(cmd1)
rc2 = os.system(cmd2)

conn.commit()

conn.close()

【讨论】:

  • 感谢您的帮助。我试过了,但在SELECT COUNT(*) FROM table_1; 之后又为零了):
猜你喜欢
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多