我正在使用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)
这是一种正确的方法吗?
答案 0 :(得分:0)
如果您要开始使用类为数据库表提供抽象层,那么您也可以开始使用ORM。一些例子是SQLAlchemy和SQLObject,两者都非常受欢迎。
这是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
在表类中,您可以使用所需的数据库封装所有操作。