Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t create_all alchemy-指定的键太长_Python_Mysql_Sqlalchemy - Fatal编程技术网

Python Can';t create_all alchemy-指定的键太长

Python Can';t create_all alchemy-指定的键太长,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,当我尝试运行db.create_all()来创建MySQL表时,出现以下错误: sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1071, 'Specified key was too long; max key length is 767 bytes') [SQL: '\nCREATE TABLE post (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\tblog_id INTEGE

当我尝试运行
db.create_all()
来创建MySQL表时,出现以下错误:

sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1071, 'Specified key was too long; max key length is 767 bytes') [SQL: '\nCREATE TABLE post (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\tblog_id INTEGER, \n\tuser_id INTEGER, \n\ttitle VARCHAR(80), \n\tbody TEXT, \n\timage VARCHAR(255), \n\tslug VARCHAR(256), \n\tpublish_date DATETIME, \n\tlive BOOL, \n\ttag_id INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(blog_id) REFERENCES blog (id), \n\tFOREIGN KEY(user_id) REFERENCES user (id), \n\tUNIQUE (slug), \n\tCHECK (live IN (0, 1)), \n\tFOREIGN KEY(tag_id) REFERENCES tag (id)\n)\n\n']
如何解决此错误?我不确定问题的来源。我可以
在我的开发环境中创建\u all()
数据库,但不能在我的主机上。我假设这是对服务器MySQL服务的列大小限制。我对表格内容的编码是否效率低下?我的模型结构有误吗? 我已尝试更改我的
设置。py

DB\u URI=“mysql+pymysql://%s:%s@%s/%s?charset=utf8”%(DB\u用户名、DB\u密码、DB\u主机、BLOG\u数据库名称)

我还尝试了
SET@@global.innodb_large_prefix=1作为


模型
从我的应用程序导入数据库,上传图片
从日期时间导入日期时间
类博客(db.Model):
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String(80))
admin=db.Column(db.Integer,db.ForeignKey('user.id'))
posts=db.relationship('Post',backref='blog',lazy='dynamic')
定义初始化(自我、姓名、管理员):
self.name=名称
self.admin=admin
定义报告(自我):
返回“%self.name”
班级职位(db.Model):
id=db.Column(db.Integer,主键=True)
blog_id=db.Column(db.Integer,db.ForeignKey('blog.id'))
user\u id=db.Column(db.Integer,db.ForeignKey('user.id'))
title=db.Column(db.String(80))
body=db.Column(db.Text)
image=db.Column(db.String(255))
slug=db.Column(db.String(256),unique=True)
发布日期=db.Column(db.DateTime)
live=db.Column(db.Boolean)
tag_id=db.Column(db.Integer,db.ForeignKey('tag.id'))
tag=db.relationship('tag',
backref=db.backref('posts',lazy='dynamic'))
@财产
def imgsrc(自身):
返回上传的_images.url(self.image)
def u_init _;(self、blog、user、title、body、tag、image=None、slug=None、publish\u date=None、live=True):
self.blog_id=blog.id
self.user\u id=user.id
self.title=标题
self.body=身体
self.tag=tag
self.image=image
self.slug=slug
如果发布日期为“无”:
self.publish\u date=datetime.utcnow()
self.live=live
定义报告(自我):
返回“”%self.title
类标记(db.Model):
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String(50))
定义初始化(self,name):
self.name=名称
定义报告(自我):
返回self.name

从我的应用程序导入数据库
从blog.models导入帖子
从日期时间导入日期时间
导入日期时间
类用户(db.Model):
id=db.Column(db.Integer,主键=True)
fullname=db.Column(db.String(80))
email=db.Column(db.String(35),unique=True)
username=db.Column(db.String(25),unique=True)
密码=db.Column(db.String(60))
paid_until=db.Column(db.DateTime,默认值=DateTime.DateTime.utcnow)
posts=db.relationship('Post',backref='user',lazy='dynamic')
定义初始化(自我、全名、电子邮件、用户名、密码):
self.fullname=fullname
self.email=电子邮件
self.username=用户名
self.password=密码
定义报告(自我):
返回“%self.username”

谢谢。

这个问题实际上是由课程中的学生回答的。问题是
slug
上的索引(当您将其标记为唯一时,它正在创建索引)

因为它是varchar,所以MySQL中索引列的最大字符串长度是255。如果slug是utf8,那么我们需要假设更小的长度(255/3=最大85个字符,因为每个utf8字符是3个字节)

因此,只需将slug上的varchar大小减少到256个字符以下(学生们提到252个字符)


这里有一个关于这个问题的答案。

这个问题实际上是由课程中的学生回答的。问题是
slug
上的索引(当您将其标记为唯一时,它正在创建索引)

因为它是varchar,所以MySQL中索引列的最大字符串长度是255。如果slug是utf8,那么我们需要假设更小的长度(255/3=最大85个字符,因为每个utf8字符是3个字节)

因此,只需将slug上的varchar大小减少到256个字符以下(学生们提到252个字符)

这是一个关于这个问题的问题

from my_app import db, uploaded_images
from datetime import datetime

class Blog(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    admin = db.Column(db.Integer, db.ForeignKey('user.id'))
    posts = db.relationship('Post', backref='blog', lazy='dynamic')

    def __init__(self, name, admin):
        self.name = name
        self.admin = admin

    def __repr__(self):
        return '<Name %r>' % self.name

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    blog_id = db.Column(db.Integer, db.ForeignKey('blog.id'))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    title = db.Column(db.String(80))
    body = db.Column(db.Text)
    image = db.Column(db.String(255))
    slug = db.Column(db.String(256), unique=True)
    publish_date = db.Column(db.DateTime)
    live = db.Column(db.Boolean)

    tag_id = db.Column(db.Integer, db.ForeignKey('tag.id'))
    tag = db.relationship('Tag',
        backref=db.backref('posts', lazy='dynamic'))

    @property
    def imgsrc(self):
        return uploaded_images.url(self.image)

    def __init__(self, blog, user, title, body, tag, image=None, slug=None, publish_date=None, live=True):
            self.blog_id = blog.id
            self.user_id = user.id
            self.title = title
            self.body = body
            self.tag = tag
            self.image = image
            self.slug = slug
            if publish_date is None:
                self.publish_date = datetime.utcnow()
            self.live = live

    def __repr__(self):
        return '<Post %r>' % self.title


class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return self.name
from my_app import db
from blog.models import Post
from datetime import datetime
import datetime


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    fullname = db.Column(db.String(80))
    email = db.Column(db.String(35), unique=True)
    username = db.Column(db.String(25), unique=True)
    password = db.Column(db.String(60))
    paid_until = db.Column(db.DateTime, default=datetime.datetime.utcnow)

    posts = db.relationship('Post', backref='user', lazy='dynamic')

    def __init__(self, fullname, email, username, password):
        self.fullname = fullname
        self.email = email
        self.username = username
        self.password = password

    def __repr__(self):
        return '<User %r>' % self.username