使用 Python3 创建一个 sqlite 表

Posted

技术标签:

【中文标题】使用 Python3 创建一个 sqlite 表【英文标题】:Creating a sqlite table with Python3 【发布时间】:2018-01-06 04:43:42 【问题描述】:

我正在使用 sqlite3 包通过类实现来创建、连接和管理 sqlite 数据库。在一种方法中,我创建了一个数据库,在下一种方法中,我尝试使用? 的参数替换在该数据库中创建一个表。但是,sqlite 不会接受该命令。我哪里出错了,如何让 python-sqlite 接受 execute 命令来创建表头?下面附上我的示例代码。

class ManageDatabase:
    def __init__(self, database, table_name):
        self.database = database
        self.table_name = table_name

    def create_database(self):
        # This function works so I will omit the details

    def connect_to_database(self):
        # This function also works
        self.conn = sqlite3.connect(self.database)
        self.cur = self.conn.cursor()

    def create_table(self, headers):
        # headers = ['id integer primary key', 'Column1 REAL', 'Column2 TEXT']
        # - In this case, headers has 3 entries, but this can be whatever 
        #   the user wants and the code must be able to adapt

        ''' This is where the code runs into trouble '''
        query = 'CREATE TABLE tn (?);'.format(tn=self.table_name)
        self.cur.execute(query, (*headers, ))
        self.conn.commit()

if __name__ == "__main__":
    data = ManageDatabase('Test.db', 'db_table')
    # - The database already exists, but does not have a table,
    #   so there is no need to use data.create_database()

    data.connect_to_database() # This command executes successfully
    headers = ['id integer primary key', 'Column1 REAL', 'Column2 TEXT']        
    data.create_table(headers)

此时我收到错误sqlite3.OperationalError: near "?": syntax error。如何编写此代码以使其与 headers 列表中的数据一起使用,并且还可以足够灵活以允许用户输入 5、6 或他们选择的许多标题列和数据类型?

【问题讨论】:

问题是(?) 是一个值(sql 转义)。您正在尝试插入 3 个项目,因此您需要 (?,?,?)。表名和列名不适合 sql 转义值概念,因为它被单引号和内部单引号加倍等。您的第一个标题将变为 'id integer primary key',这将是不正确的。虽然我没有用表名或列名测试过。 【参考方案1】:

一种可能的解决方案是将数据与format 并在join 的帮助下连接:

def create_table(self, headers):
    try:
        query = 'CREATE TABLE tn (fields)'.format(tn=self.table_name, fields=",".join(headers))
        self.cur.execute(query)
        self.conn.commit()
    except sqlite3.Error as er:
        print(er)

【讨论】:

以上是关于使用 Python3 创建一个 sqlite 表的主要内容,如果未能解决你的问题,请参考以下文章

mac上安装python3 和 sqlite的问题

在python3中将日期值存储到sqlite表中

如何使用我的 Python3 fbs 包打包 Sqlite3 数据库?

QT使用SQLite

Python3+SQLAlchemy+Sqlite3实现ORM教程

使用 SQLite 获取存在特定 ID 值的所有表的列表