【问题标题】:SQLAlchemy necessary table propertiesSQLAlchemy 必要的表属性
【发布时间】:2013-02-24 02:57:25
【问题描述】:

在为预先存在的数据库编写 SQLAlchemy 模型时,我必须提供多少有关表的信息?考虑这个表,它是 MySQL 数据库的一部分:

CREATE TABLE entities (
    id INTEGER NOT NULL AUTO_INCREMENT,
    dn VARCHAR(100) NOT NULL UNIQUE,
    PRIMARY KEY (id)
) Engine=InnoDB, COLLATE utf8_unicode_ci;

根据我的测试,这足以使用它:

class Entity(Base):
    __tablename__ = 'entities'
    id          = Column('id', Integer, primary_key=True)
    dn          = Column('dn', String(100))

但当然它缺少 UNIQUE、AUTO_INCREMENT、Engine 和 COLLATE 信息。 SQLAlchemy 是否关心这些?

我当然可以使用反射,但出于一致性原因,我宁愿不使用。

【问题讨论】:

    标签: mysql reflection sqlalchemy create-table


    【解决方案1】:

    以下内容应该在语义上产生相同的结果,尽管不会产生相同的查询:

    class Entity(Base):
        __tablename__ = 'entities'
        __table_args__ = {'mysql_engine':'InnoDB'}
        id          = Column('id', Integer, primary_key=True)
        dn          = Column('dn', String(100, collation='utf8_unicode_ci'), unique=True)
    

    我只是不确定如何为整个表指定排序规则。

    【讨论】:

    • 您可以像这样指定排序规则:__table_args__ = { 'mysql_engine': 'InnoDB', 'mysql_charset': 'utf8', 'mysql_collate': 'utf8_general_ci' } 但问题是:sqlalchemy 会关心吗?或者如果表已经存在也没关系?
    • sqlachemy (v1.2.5) cares 在创建时:没有任何__table_args__,排序规则是latin1_swedish_ci。使用来自@GevatterGaul 的参数,我得到了预期的结果:utf8_general_ci。我的语言环境是en_US.UTF-8
    【解决方案2】:
    class Users(db.Model):
        __tablename__='users'
        __table_args__ = {'mysql_engine':'InnoDB', 'mysql_charset':'utf8','mysql_collate':'utf8_czech_ci'}
        id=db.Column('iduser', db.Integer, primary_key=True)
        name=db.Column('column_name', db.String(193))
    
        def __init__(self, name):
            self.name=name
    
        def __repr__(self):
            return self.name
    

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      相关资源
      最近更新 更多