Python SqlAlchemy以实用方式生成表类

时间:2014-08-19 03:51:46

标签: python sqlalchemy

给定一个表名列表,我试图以编程方式生成SqlAlchemy db表类。这是我的工作:

def generate_table_class_list(engine):
    base = declarative_base(engine)
    table_names = ['table_a', 'table_b']
    table_classes = dict()
    for table in table_names:
        table_classes[table] = generate_table_class(table)
    return table_classes

def generate_table_class(base, table_name):
    return type(table_name, (base,), dict(__tablename__ = table_name,
                                          __table_args__ = {'autoload' : True})) 

当我运行generate_table_class_list(引擎)时,我收到以下错误消息:

/opt/packages/sqlalchemy/engine/result.pyc in first(self)
    829         try:
    830             if row is not None:
    --> 831                 return self.process_rows([row])[0]
    832             else:
    833                 return None

/opt/packages/sqlalchemy/engine/result.pyc in process_rows(self, rows)
    759         else:
    760             return [process_row(metadata, row, processors, keymap)
    --> 761                     for row in rows]
    762 
    763     def fetchall(self):

TypeError: row must be a sequence

我使用类似的脚本之前使用相同的版本sqlalchemy执行此操作并且它可以工作。但是,这次不起作用。

感谢任何帮助。提前致谢。

2 个答案:

答案 0 :(得分:1)

经过几天的研究和测试,我明白了。当我创建引擎时,我将游标类设置为SSDictCursor。当我转向SSCursor时,它对我很好,即使我仍然不知道为什么SSDictCursor会破坏我的代码。

答案 1 :(得分:0)

DictCursor也在努力。只有在创建游标时才需要指定它。请检查一下。

connectString = 'mysql+pymysql://{}:{}@{}:{}/{}?charset={}'.format(userDB, passDB, hostDB, portDB, databasename, 'utf8mb4');
engineConnect = create_engine(connectString, connect_args= {'autocommit' : True});

conn = engineConnect.connect();

with conn.connection.cursor(pymysql.cursors.DictCursor) as cursorForFind:
    cursorForFind.execute(queryString, (username));

    (rowCnt, rowVal) = (cursorForFind.rowcount, cursorForFind.fetchone());