【问题标题】:Python Script for sqlite3 can't create tablesqlite3的Python脚本无法创建表
【发布时间】:2020-11-21 16:22:48
【问题描述】:
import sqlite3
conn = sqlite3.connect('serpin.db')

c = conn.cursor()

c.execute("""CREATE TABLE Gene(Gene_name TEXT, Organism TEXT, link_2_gene_with_ID TEXT, Number_SpliceForm INTEGER,ID_mRNA INTEGER, ID_Prt INTEGER);""")

c.execute(".import practice.csv Gene --csv")
c.execute(".mode column")
c.execute("select * from Gene;")
print(c.fetchall())
conn.commit()
conn.close

我可以在 sqlite3 的 windows 终端上单独运行所有这些命令。但是,我在运行此代码时遇到了多个错误,这大致是我在没有错误的 bash 脚本中使用的。我收到的第一个错误是“表基因已经存在”的错误。现在,即使我注释掉该行,我也会在导入命令中得到一个错误,它说在导入之前的句点存在语法错误。这些都是 sqlite3.OperationalError。我已经尝试直接在 sqlite3 中自己运行这些命令并且没有问题,所以我不确定问题是什么。

我在这个文件夹中没有数据库,所以我不确定表是如何制作的。

edit(solution): this 的输出格式不正确,但运行时没有错误。

import csv,sqlite3
conn = sqlite3.connect('serpin.db')

c = conn.cursor()

try:
   c.execute("""CREATE TABLE Gene (Gene_name TEXT, Organism TEXT, link_2_gene_with_ID TEXT, Number_SpliceForm INTEGER,ID_mRNA INTEGER, ID_Prt INTEGER);""")
except:
   pass
path = r'C:\Users\User\Desktop\sqlite\practice.csv'
with open(path,'r') as fin: # `with` statement available in 2.5+
    # csv.DictReader uses first line in file for column headings by default
    dr = csv.DictReader(fin) # comma is default delimiter
    to_db = [(i['Gene_name'], i['Organism'],i['link_2_gene_with_ID'],i['Number_SpliceForm'],i['ID_mRNA'],i['ID_Prt'] ) for i in dr]

c.executemany("INSERT INTO Gene (Gene_name,Organism,link_2_gene_with_ID,Number_SpliceForm,ID_mRNA,ID_Prt) VALUES (?,?,?,?,?,?);", to_db)
c.execute("select * from Gene;")
print(c.fetchall())
conn.commit()
conn.close

【问题讨论】:

  • 这些带点号的命令用于 Sqlite shell。实际的数据库引擎不支持它们。

标签: python sqlite


【解决方案1】:

关于您可能已经创建了表并给您一个错误的事实:

try:
    c.execute("""CREATE TABLE Gene(Gene_name TEXT, Organism TEXT, link_2_gene_with_ID TEXT, Number_SpliceForm INTEGER,ID_mRNA INTEGER, ID_Prt INTEGER);""")
except:
    pass

为了导入文件,我在这里从用户 mechanical_meat 的另一个回答中报告 Importing a CSV file into a sqlite3 database table using Python:

import csv, sqlite3

con = sqlite3.connect(":memory:") # change to 'sqlite:///your_filename.db'
cur = con.cursor()
cur.execute("CREATE TABLE t (col1, col2);") # use your column names here

with open('data.csv','r') as fin: # `with` statement available in 2.5+
    # csv.DictReader uses first line in file for column headings by default
    dr = csv.DictReader(fin) # comma is default delimiter
    to_db = [(i['col1'], i['col2']) for i in dr]

cur.executemany("INSERT INTO t (col1, col2) VALUES (?, ?);", to_db)
con.commit()
con.close()

不知道.mode命令,但据我所知,python中SQLite3中的操作都是大写的,所以select也应该是选择

【讨论】:

  • 谢谢,有了一些模组,这行得通。现在我只需要把它格式化。
  • 很好,希望对您有帮助
猜你喜欢
  • 1970-01-01
  • 2016-12-05
  • 2017-08-13
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2020-06-28
相关资源
最近更新 更多