免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2066 | 回复: 2
打印 上一主题 下一主题

吐槽一下SQLAlchemy的多主建添加报错问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-28 14:25 |只看该作者 |倒序浏览
最近在用SQLAlchemy进行数据库编程,我用如下代码新建表并添加主键:
class Admin(db.Model):
    __tablename__ = 'admin_info'

    admin_id = db.Column("admin_id", db.String(20), primary_key=True)
    key_id = db.Column("key_id", db.INT, primary_key=True)
    key_comment = db.Column("key_comment", db.String(20))
    lock_id = db.Column("lock_id", db.BIGINT, primary_key=True)
     
    def __init__(self, admin_id, key_id, key_comment, lock_id):
        self.admin_id = admin_id
        self.key_id = key_id
        self.key_comment = key_comment
        self.lock_id = lock_id
            
    def __repr__(self):
        return 'Administrator %r' % self.admin_id

运行总是报错:<(OperationalError) (1075, 'Incorrect table definition; there can be only one auto column and it must be defined as a key') '\nCREATE TABLE admin_info (\n\tadmin_id VARCHAR(20) NOT NULL, \n\tkey_id INTEGER NOT NULL, \n\tkey_comment VARCHAR(20), \n\tlock_id BIGINT NOT NULL AUTO_INCREMENT, \n\tPRIMARY KEY (admin_id, key_id, lock_id)\n)\n\n' ()>       ps:恶心死我了

但是这么简单代码,我一行一行的检查,并没有发现什么错误啊。于是我就只有请出谷歌兄帮忙了,捣腾了大半天,我艹,终于找到问题出在哪儿了。。。原来在新建表的时候,添加多主键是由默认规则的,SQLAlchemy文档如是说:“When creating tables, SQLAlchemy will automatically set AUTO_INCREMENT on the first Integer primary key column which is not marked as a foreign key.You can disable this behavior by passing False to the autoincrement argument of Column. This flag can also be used to enable auto-increment on a secondary column in a multi-column key for some storage engines”,擦,这就是问题的关键了,我的key_id就是定义为整型的,且为主键,它给劳资默认为自增长的了,怪不得报错,尼玛,坑死我了。。。最后说一下解决办法吧,在key_id = db.Column("key_id", db.INT, primary_key=True)这行的括号里边添加一句autoincrement=False就OK了

发帖的初衷是希望以后用到SQLAlchemy进行多主建设置的时候不要再被坑了

论坛徽章:
0
2 [报告]
发表于 2014-11-28 14:40 |只看该作者
lock_id = db.Column("lock_id", db.BIGINT, primary_key=True)这行也要加 autoincrement=False

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
3 [报告]
发表于 2014-11-29 14:29 |只看该作者
sqlalchemy很强大,也很复杂。而且文档写得不够精炼全面。

sqlalchemy在定义关系列是,如果使用模型类作为参数,则会引起循环导入,而使用字符串做参数时,这个类型却不能是模型类名,只能是表名。

这就造成,在sqlalchemy中,又有模型类名,又有字符串的表名,这不太优雅。

按理说,ORM代码中,只应该出现模型类的名字,表名这样的东西应该是下一层,不应该出现在代码中的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP