给定一个表名列表,我试图以编程方式生成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执行此操作并且它可以工作。但是,这次不起作用。
感谢任何帮助。提前致谢。
答案 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());