如何让用户在sqlite3,python3中输入表名?

w6mmgewl  于 2023-01-21  发布在  SQLite
关注(0)|答案(2)|浏览(167)

我需要提示用户创建一个student表,检查数据库中是否存在具有此名称的表,如果不存在,则创建该表。

import sqlite3
conn = sqlite3.connect('School')
print ("Database has been created")

def create_table():
 TableName = input("Enter table name: ")
 tb_create ="""CREATE TABLE , (TableName,) (ID INT PRIMARY KEY,title VARCHAR(10), forename VARCHAR(20), 
 surname VARCHAR(20))"""
 tb_exists ="SELECT name FROM sqlite_master WHERE type='table' AND name= ?", (TableName,)
 if not conn.execute(tb_exists).fetchone():
   conn.execute(tb_create)
   print ("Table created successfully")
 else:
 print ("Table Exists!")

我知道可以将用户输入的值插入到表中,但是我如何创建一个带有输入名称的表?CREATE TABLE后面应该写什么?如果我使用,(TableName),代码将无法编译。另外,一旦新表被添加到数据库中,我如何在INSER INTO查询中指示它的名称?

def insert_data():
 conn.execute("INSERT INTO TableName (ID,title,forename,surname)VALUES \
 (234,'Mr','XXX','XXX'")
 conn.commit()
zu0ti5jz

zu0ti5jz1#

CREATE TABLE语句的正确语法为:

CREATE TABLE tablename(column1 datatype1, column2 datatype2, ....)

既然你想让用户提供表的名称,你可以用字符串插值来完成,因为你不能在sql查询中用一个?占位符作为参数来传递它:

tb_create = f"CREATE TABLE [{TableName}](ID INTEGER PRIMARY KEY, title TEXT, forename TEXT, surname TEXT)"

表名必须用方括号括起来,以防用户提供的名称无效(例如,它以数字开头或包含空格)。
此外,如果希望列ID自动增量,则必须使用INTEGER而不是INT作为其数据类型。
此外,SQLite中没有VARCHAR数据类型,请使用TEXT
您可以将变量TableName定义为全局变量,以便可以在所有函数中使用它,例如insert_data()
INSERT语句也使用字符串插值。

import sqlite3
conn = sqlite3.connect("School")
print ("Database has been created")
TableName = ""

def create_table():
  global TableName
  TableName = input("Enter table name: ").strip()
  tb_exists ="SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?"
  if not conn.execute(tb_exists, (TableName,)).fetchone():
    tb_create = f"CREATE TABLE [{TableName}](ID INTEGER PRIMARY KEY, title TEXT, forename TEXT, surname TEXT)"
    conn.execute(tb_create)
    print("Table created successfully")
  else:
    print("Table Exists!")

def insert_data():
  if len(TableName) > 0:
    conn.execute(f"INSERT INTO [{TableName}] (ID,title,forename,surname) VALUES (234,'Mr','XXX','XXX')")
    conn.commit()

create_table()
insert_data()
jexiocij

jexiocij2#

表或列的名称不能参数化,因此必须构建查询字符串。这意味着您应该控制输入的名称是否为“sane”,因为从字符串构建查询是SQL injection的矢量。
但大多数(如果不是全部)SQL数据库允许创建一个表,如果它已经不存在。语法如下:

CREATE TABLE table_name IF NOT EXISTS (
    column_name type,
    ...)

在这里,你可以这样做:

import re
...
def create_table():
 TableName = input("Enter table name: ")
 # control name:
 if not re.match(r'\w*$', TableName):
     raise IllegalValue("Invalid table name")
 tb_create =f"""CREATE TABLE {TableName} IF NOT EXISTS (ID INT PRIMARY KEY,title VARCHAR(10),
   forename VARCHAR(20), surname VARCHAR(20))"""
 conn.execute(tb_create)

相关问题