Python和sqlite3数据结构用于存储表名和列,以便多次重用

时间:2016-08-13 03:51:32

标签: python sqlite

我正在使用python sqlite3 api来创建数据库。 在我在文档表中看到的所有示例中,名称和列名称都在查询中进行了硬编码。但如果我多次重复使用同一个表(即创建表,将记录插入表,从中读取数据),这可能是一个潜在的问题。 table,alter table等...)因为在表修改的情况下我需要在多个地方更改硬编码名称,这不是一个好的编程习惯.. 我怎么解决这个问题? 我想创建一个只使用构造函数方法的类,以便存储所有这些字符串名称......并在将在数据库上操作的类中使用它。但由于我不是专家python程序员,我想分享我的想法。 ..

class TableA(object):
    def __init__(self):
        self.table_name = 'tableA'
        self.name_col1 = 'first_column' 
        self.type_col1='INTEGER'
        self.name_col2 = 'second_column' 
        self.type.col2 = 'TEXT'
        self.name_col3 = 'third_column' 
        self.type_col3 = 'BLOB'

然后在DB classe

table_A = TableA() 

def insert_table(self): 
    conn = sqlite3.connect(self._db_name) 
    query = 'INSERT INTO ' + table_A.table_name + .....  <SNIP> 
    conn.execute(query)

这是一种正确的方法吗?

3 个答案:

答案 0 :(得分:0)

如果您要开始使用类为数据库表提供抽象层,那么您也可以开始使用ORM。一些例子是SQLAlchemySQLObject,两者都非常受欢迎。

这是SQLAlchemy的味道:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine

Base = declarative_base()

class TableA(Base):
    __tablename__ = 'tableA'
    id = Column(Integer, primary_key=True)
    first_column = Column(Integer)
    second_column = Column(String)
    # etc...

engine = create_engine('sqlite:///test.db')
Base.metadata.bind = engine

session = sessionmaker(bind=engine)()

ta = TableA(first_column=123, second_column='Hi there')
session.add(ta)
session.commit()

当然,您可以为表格和列选择语义名称,但是您可以看到声明表格与您在问题中提出的内容类似,即使用类。通过创建该类的实例来简化插入记录。

答案 1 :(得分:0)

我不知道什么是正确的,但我可以告诉你,这不是传统的。

如果您真的想将表结构化为类,可以考虑像SQLAlchemy这样的对象关系映射器。否则,你的方式,你怎么知道你有多少列变量?那么存储一个2项目列表的列表呢?或者词典列表?

self.column_list = []
self.column_list.append({'name':'first','type':'integer'})

你这样做的方式听起来很新颖。查看他们的代码并了解他们是如何做到的。

答案 2 :(得分:0)

我个人不喜欢没有正当理由使用库和框架。所以,如果我有这样的理由,那么就会围绕sqlite写一个思考包装。

class Column(object):
    def __init__(self, col_name="FOO", col_type="INTEGER"):
        # standard initialization

然后用数据库

封装操作的表类
class Table(object):
    def __init__(self, list_of_columns, cursor):
        #initialization
    #create-update-delete commands

在表类中,您可以使用所需的数据库封装所有操作。